Hibernate中Session对象一些方法的小区分

来源:互联网 发布:域名转入一般需要几天 编辑:程序博客网 时间:2024/04/28 22:07

1.load()与get()的区别:

session.get(Class clazz,int id);get方法包含两个参数,Class是某一个类的结构,可以通过java的反射机制获取到,id是hibernate创建表的主键的id ,查询的时候根据class查到映射文件,并通过映射文件找到数据库中表的名称,通过id查到此表中的这条数据。

session.load(Class clazz,int id);Load中的参数和get方法中一样的,只是掉用此方法返回的Object对象已不是原先的class对象,而是类的代理对象,也就是它的子类,但这个子类包含了更强大的实现功能,其中就包括查询数据库的方法,但是查询的操作不会立即执行,只有在需要访问这条数据时候才会执行查询数据操作,这样就减少了不必要的计算机性能。

 

2.persist方法和save()方法区别

唯一的区别在于事务的开启上面:save方法是在没开启事务的情况下,插入数据库之后就立即进行回滚,而persist()方法是如果没有开启事务,就不会执行插入数据库的操作。

 

3.saveOrUpdate()方法与merge()方法

hibernate中对象有三种状态:瞬时,持久和脱管(游离),当对象的状态由持久态变为游离态的时候,再改变对象的属性是不会更新到数据库的,因为当前的session已经关闭,但是仍要更新到数据库,就要调用更新方法,使数据更新,但是如果传过来的对象不清楚是瞬时态还是脱管态,这时就要调用saveOrUpdate()方法了,当前对象就会由托管状态变为持久状态,并更新到数据库,而如果当前调用merge()方法也会更新数据,但是此对象仍会是托管状态的。

 

 但是hibernate又是如何知道当前对象是瞬时态还是脱管态的呢?

每个对象在保存或者更新之后hibernate都会自动分配int类型或者string类型的属性,当变为托管状态的时候,此属性仍然存在,可以判断此属性的值,如果为0或者为字符串null则此对象就为瞬时态,否则就为脱管态。

原创粉丝点击