疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

浅谈hibernate save和saveOrUpdate区别


 

   

  Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

  save和saveOrUpdate的区别,估计大家都比较了解

  save是保存要持久化的数据,会走insert语句

  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方法,执行更新操作