hibernate持久化对象操作

闲着没事做,整理了hibernate持久化对象操作相关内容,供大家参考。

 

一、由session缓存清理操作引起的问题
(一)session在一下不同的情况下进行清理操作:
1、在查询执行之前,如果发现缓存中的持久化对象属性发生了变化,session会先执行清理,保证查询的数据不脏数据。
2、在调用事务提交commit()的时候,commit()方法先清理缓存,然后再向数据库提交事务
3、调用session.flush()的时候,(与commit不同的是,flush()只是执行清理工作)。
(二)session执行清理sql语句的顺序
1、所有对持久对象进行插入的语句,其顺序按照调用session.save()的顺序;
2、所有对持久对象进行更新的语句;
3、所有进行集合删除的语句;
4、所有对集合元素进行删除、更新或插入的语句;
5、所有进行集合插入的语句;
6、所有对实体进行删除的语句,其顺序按照对象执行session.delete()的时间顺序。
(三)3种控制清理的方式:FlushMode.COMMIT只在事务提交时清理,按照缓存顺序执行;FlushMode.AUTO默认方式进行清理(Hibernate的默认方式);lushMode.NEVER调用flush()方法时清理。通过session.setFlushMode()方法设定。
(四)引起的问题一,在执行事务提交前清除了相应的缓存数据。
session.evict(obj);transaction.commit();解决方法是在evict()前面加上flush()方法,或者把evict()放在commit()后面。
(五)引起的问题二,数据冲突
A a = new A();
a.setName("a");
session.save(a);
a.setName("b");
session.update(a);
A a1 = new A();
a1.setName("a");
session.save(a1);
session.flush();
由于session执行清理sql语句的顺序,先执行全部的插入语句,所以先执行了save(a)和save(a1)缓存的数据,再执行update(a)缓存的数据。解决方法是再update(a)后加上flush()函数或者采用FlushMode.COMMIT清理方式。

 

二、save()函数
save()函数放在对持久化对象设置属性函数前,会多出update语句,例如
session.save(obj);
obj.setName("a");//对持久化对象的属性进行修改
会多出update A set name=? where id=?的语句,导致额外的开销。

 

三、get()和load()函数
1、load()函数可以利用二级缓存,而get()不行;
2、如果没有匹配的记录,load()会抛出异常,get()不会;

 

四、update()函数
update()函数的作用就是将脱管对象重新和Session进行关联,转换为持久对象,通知session生成一条UPDATE语句同步数据库,因为对脱管对象属性的修改不能反映到数据库中。并非与spring里面getHibernateTemplate().update()函数相同。
用update()把脱管对象重新session关联时,如果该session已经有了相同对象标识符的持久对象,就会抛出异常。除非在<class>节点配置属性select-before-update="true",这样就会在update操作时生成一条select语句将数据库记录与需要更新的对象属性进行比较。不过对于经常更新的记录来说,配置该属性,在每次更新都会生成一条select语句,会降低应用程序的性能。

 

五、lock()函数
lock()方法用处:用于版本检查;升级锁为悲观锁(lock(obj,LockMade.READ));重新把游离实例于一个session实例相关联。
在执行lock方法时,会立即使用查询语句select查询版本号进行版本检查,不会执行一个update操作。而在执行update()方法时,并不会进行版本检查,直到执行flush方法,会先进行版本检查,在进行更新操作。

六、delete()、saveOrUpdate()函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值