• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >swift > Hibernate三种状态和Session常用的方法

Hibernate三种状态和Session常用的方法

作者:寻找现实扭曲力场 字体:[增加 减小] 来源:互联网 时间:2017-05-28

寻找现实扭曲力场 通过本文主要向大家介绍了session的状态,session 活动状态,session的三种状态,hibernate中的session,hibernate session等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

我们知道hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态(Transient,Persistent,Detached)。就像马士兵老师在视频中所说的,我们并不必死抠这些字眼,我们通过自己编写测试类就可以他们之间不同的区别。

其实三种状态各自的不必总结那么多,只是一个重要的地方就是Transient状态里面的对象是没有id的。

session中常用的方法是save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()这些

其中大学期间我其实对get和load方法都不是太熟悉,死记硬背才在考试中答题,现在想起完全没有这个必要。我们可以根据配置好的hibernate环境来进行junit测试。

首先我们进行get()方法进行测试。

这里我们首先建立一个实体类,StudentEntity.Java 和数据库中student所对应

package com.cwnu.entities; 
import javax.persistence.*; 
import java.io.Serializable; 
/** 
 * Created by yangy on 2015/12/19. 
 */ 
@Table(name = "student") 
@Entity 
public class StudentEntity implements Serializable{ 
 private int id; 
 private String name; 
 @Id 
 @Column(name = "id") 
 @GeneratedValue(strategy = GenerationType.AUTO) 
 private int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 @Column(name = "name") 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 
</div>

junit类都是idea编译环境给我们配置好了,这里我们要注意,要使用getCurrentSession()来操作的话,我们首先要在Junit类中加上@Transaction注解,下面是相关的测试方法:

 @Test 
public void testGetOrLoad() { 
 Session session = sessionFactory.getCurrentSession(); 
 StudentEntity student = (StudentEntity)session.get(StudentEntity.class, 1); 
 //StudentEntity student_load = (StudentEntity)session.load(StudentEntity.class,1); String name = student.getName(); 
} 
</div>

先测试get方法,我们发现一旦我们只是拿student这个实体操作,get方法是会输出相关的sql查询语句的,而我们注释掉get方法,换load方法的话,load方法执行拿student这个实体的数据是没有输出相应的sql语句的。但是我们在对student类进行操作的时候,这时才输出相关的语句.

所以我们看出get()和load()之间的差别:

get()每次执行都会执行sql语句,不会延迟。load()方法只是会在我们对拿到的实体进行操作的时候才去执行查询,拿到相应的实体信息。load方法返回的是一个代理对象(马士兵老师视频)。无论是get还是load首先都会查一级缓存(session)中有没有相应的对应值,如果没有,再去数据库进行查找。

clear()方法是对session里面的缓存进行了清理,测试这个方法我们可以根据下面的Junit进行测试:

@Test 
 public void testClear() { 
  Session session = sessionFactory.getCurrentSession(); 
  session.get(StudentEntity.class,1); 
  session.clear(); 
  session.get(StudentEntity.class,1); 
 } 
</div>

如果我们把session.clear()注释掉的话,我们就可以看到只执行了一条sql语句

flush()方法是是对数据库同步的一条语句,执行完这个后立即刷新到数据库。粗浅的来看哈,其实里面还是有很多东西,比如FlushMode这个类,我们默认设置的是FlushMode.AUTO,这个一般不修改,只是为了以后的性能调优。其实我们在执行事务的时候,事务完成之后它会帮我们执行flush()方法。只是我们在进行大规模插入的时候,我们经常可以看到下面的操作:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction();  
for ( int i=0; i<100000; i++ ) {  
Customer customer = new Customer(.....);  
session.save(customer);  
if ( i % 20 == 0 ) { 
//20, same as the JDBC batch size   
//flush a batch of inserts and release memory:   
session.flush();  
session.clear();  
}}  
tx.commit();session.close(); 
</div>

这样做的目的就是避免大量插入,造成session里面内存溢出,所以我们定时清理一下就可以避免这个问题。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Hibernate三种状态和Session常用的方法

相关文章

  • 2017-05-28Swift语言中字符串相关的基本概念解析
  • 2017-05-28Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
  • 2017-05-28Swift 3.0基础学习之枚举类型
  • 2017-05-28swift实现自定义圆环进度提示效果
  • 2017-05-22Swift 变量
  • 2017-05-28MyBatis 参数类型为String时常见问题及解决方法
  • 2017-05-28在Swift中使用Cocoa的现有设计模式介绍
  • 2017-05-28Swift的函数式编程详解
  • 2017-05-28Swift算法之栈和队列的实现方法示例
  • 2017-05-28Swift图像处理之优化照片

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 爬虫技术详解
    • Swift教程之枚举类型详解
    • Swift使用WKWebView在iOS应用中调用Web的方法详解
    • Swift 环境搭建
    • swift3.0指纹解锁的实现方法
    • 详解Swift中enum枚举类型的用法
    • 详解Swift中的Characters字符类型与String字符串类型
    • Swift算法之二叉树实现的方法示例
    • 浅谈在Swift中关于函数指针的实现
    • Swift教程之属性详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有