Hibernate几个易混淆方法解析及对象状态解析
2011-09-17 16:32
323 查看
load方法和get方法的区别:
举例说明:
User user=session.load(User.class,1);
其一:
此时,load方法并不会执行,而是要等到user对象第一次被使用到的时候才会执行load方法
比如,我现在写一条打印语句:
System.out.println(user.getClass().getName());
此时,load方法将会执行
其二:
load方法得到的返回值永远都不会为空,即时在你的数据库中并没有你所查找的数据
因为,load内部会自动new了一个继承于User的子类的对象,所以,对load的返回值做判空操作是多余的。
我们可以通过:
System.out.println(user.getClass().getName());来查看返回值的类型。
比如,我测试:
UserPojo user = (UserPojo) session.load(UserPojo.class, 1);
System.out.println("返回值类型:"+user.getClass().getName());
得到的一个结果为:
返回值类型:cn.com.pojo.UserPojo$$EnhancerByCGLIB$$efc4150e
我们将load的这种机制,叫做懒加载
persist与save的方法的区别:
如果没有开启事务,save方法会执行插入语句,然后回滚;而persist根本就不会执行插入语句。
在Hibernate中,存在三种状态的对象:
瞬时状态(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收期回收,一般是new出来
且与session没有关联的对象。
持久状态(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭
,事务没有提交:持久对象状态发生该改变,在事务提交时会影响到数据库(Hibernate能够检测到)
脱管状态(detached):数据库中有数据与之对应,但当没有session与之关联;托管对对象状态发生改变,
Hibernate不能检测到。
所以对于持久状态的对象,我们想要跟新起对应的数据库中的数据,无需调用update方法,直接修改对象属性
,即可被Hibernate检测到,自动的会生成跟新语句,但这时候并不会立刻执行,而是等到提交的时候在并执
行。
所以可以说,update方法是用来操作脱管状态对象的,而insert方法是用来操作瞬时状态对象的。
当我们无法确定一个对象是处于何种状态,这时候,可以调用saveOrUpdate方法,由Hibernate自动判断状态
,执行相应的方法。Hibernate是通过配置文件中,主键id元素的属性unsave-value来判断的,如果是整形,
则unsave-value默认值为0,如果是String类型,则默认值为null;如果为0或null则表示未保存,是非持久状
态,我们也可以指定unsave-value的值,比如可以指定当unsave-value=-1的时候表示未保存。
对象状态转换解析图:
举例说明:
User user=session.load(User.class,1);
其一:
此时,load方法并不会执行,而是要等到user对象第一次被使用到的时候才会执行load方法
比如,我现在写一条打印语句:
System.out.println(user.getClass().getName());
此时,load方法将会执行
其二:
load方法得到的返回值永远都不会为空,即时在你的数据库中并没有你所查找的数据
因为,load内部会自动new了一个继承于User的子类的对象,所以,对load的返回值做判空操作是多余的。
我们可以通过:
System.out.println(user.getClass().getName());来查看返回值的类型。
比如,我测试:
UserPojo user = (UserPojo) session.load(UserPojo.class, 1);
System.out.println("返回值类型:"+user.getClass().getName());
得到的一个结果为:
返回值类型:cn.com.pojo.UserPojo$$EnhancerByCGLIB$$efc4150e
我们将load的这种机制,叫做懒加载
persist与save的方法的区别:
如果没有开启事务,save方法会执行插入语句,然后回滚;而persist根本就不会执行插入语句。
在Hibernate中,存在三种状态的对象:
瞬时状态(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收期回收,一般是new出来
且与session没有关联的对象。
持久状态(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭
,事务没有提交:持久对象状态发生该改变,在事务提交时会影响到数据库(Hibernate能够检测到)
脱管状态(detached):数据库中有数据与之对应,但当没有session与之关联;托管对对象状态发生改变,
Hibernate不能检测到。
所以对于持久状态的对象,我们想要跟新起对应的数据库中的数据,无需调用update方法,直接修改对象属性
,即可被Hibernate检测到,自动的会生成跟新语句,但这时候并不会立刻执行,而是等到提交的时候在并执
行。
所以可以说,update方法是用来操作脱管状态对象的,而insert方法是用来操作瞬时状态对象的。
当我们无法确定一个对象是处于何种状态,这时候,可以调用saveOrUpdate方法,由Hibernate自动判断状态
,执行相应的方法。Hibernate是通过配置文件中,主键id元素的属性unsave-value来判断的,如果是整形,
则unsave-value默认值为0,如果是String类型,则默认值为null;如果为0或null则表示未保存,是非持久状
态,我们也可以指定unsave-value的值,比如可以指定当unsave-value=-1的时候表示未保存。
对象状态转换解析图:
相关文章推荐
- Hibernate几个易混淆方法解析及对象状态解析
- 解析Hibernate中对象的三种状态
- 【Hibernate框架开发之五】Hibernate对象的三种状态&Session常用方法
- 框架学习之Hibernate 第四节 实体对象的三种状态和saveOrUpdate方法
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- Hibernate对象的三种状态&&Session的常用方法
- Hibernate对象的三种状态区别以及save等几种方法的区别
- Hibernate持久化对象的状态和对象持久化的方法
- 【Hibernate框架开发之五】Hibernate对象的三种状态&&Session的常用方法
- Hibernate入门BLOG [三、session的常用方法和hibernate对象的3种状态]
- 05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法 1
- ORM进阶之Hibernate中对象的三大状态解析
- 05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法 2 关于delete后的状态
- 深入学习Hibernate4_05hibernate中对象的四种状态(临时状态,持久化状态,游离状态,删除状态),以及常用方法的介绍
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- Hibernate中对象的三种状态,以及三种状态间的转化方法
- Hibernate之Session对象的相关方法以及持久化对象的状态
- Hibernate持久化对象状态、转换方法和操作步骤
- Hibernate入门:CRUD方法及实体对象的三种状态
- 【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解