Hibernate几个易混淆方法解析及对象状态解析

来源:互联网 发布:windows live登陆 编辑:程序博客网 时间:2024/06/01 22:20
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的时候表示未保存。

 

对象状态转换解析图:

 

 


原创粉丝点击