浅谈hibernate save和saveOrUpdate区别

来源:互联网 发布:dijkstra算法 堆优化 编辑:程序博客网 时间:2024/06/05 01:06

hibernate的对象有3种状态,分别为:瞬时态(Transient)持久态(Persistent)脱管态(Detached)
处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)
save和saveOrUpdate的区别,估计大家都比较了解

  1. save是保存要持久化的数据,会走insert语句
  2. saveOrUpdate是根据unsave-value的设定,判定是要save还是update操作

今天,做项目碰到一个问题,我在service层中的一个函数中对一个实体batch(批次)进行一次save然后进行数据处理,最后又调用了一次update方法用于更新batch的状态,即添加时状态为“0”,数据处理后更新状态为“1”,此时出现

a different object with the same identifier value was already associated with the session
异常,它的意思是在一个操作里有了两个同样的标示符,分析后认为update时数据需为po,但save后batch变为了vo状态,此时update时导致此异常,后来在update前先get一下batch然后update是没问题的,但是这样有导致多走了一次select语句,因为batch与数据库是一直的(因为刚刚save),所以就想如何让其insert后仍然处于po状态,后来看到资料使用了saveOrUpdate方法,测试后发现,没有问题,不再出异常.

所以认为save和 saveOrUpdate除了在运行机制上有区别以外,在insert以后,save后的实体处于vo状态,而通过saveOrUpdate后的实体
处于po状态,可以修改实体后直接调用update方法,执行更新操作

0 0
原创粉丝点击