hibernate envers:merge&saveOrUpdate

par*_*rbi 3 java hibernate hibernate-envers

我正在开发一个spring-hibernate-envers应用程序.很多谷歌搜索后的东西终于为我工作,但我仍然有几个问题.

  1. 早些时候我saveOrUpdate用于保存或更新实体.但是当与envers合作时,它会抛出nonUniqueObject 异常.所以我使用了merge而且它有效.为此使用合并是否正确?是否merge将新对象插入db?

  2. 我试过以下代码:

entity=merge(entity);  
saveOrUpdate(entity);
Run Code Online (Sandbox Code Playgroud)

这也有效.这是正确的方法吗?而且我很好奇为什么saveOrUpdate现在不抛出任何错误.

axt*_*avt 10

Hibernate Reference说:

saveOrUpdate()执行以下操作:

  • 如果对象在此会话中已经持久化,则不执行任何操作
  • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常
  • 如果对象没有标识符属性,则保存()它
  • 如果对象的标识符具有分配给新实例化对象的值,则保存()它
  • 如果对象是由or或版本化的,并且version属性值是分配给新实例化对象的相同值,则save()它
  • 否则更新()对象

和merge()是非常不同的:

  • 如果存在具有当前与会话关联的相同标识符的持久实例,则将给定对象的状态复制到持久实例上
  • 如果当前没有与会话关联的持久性实例,请尝试从数据库加载它,或者创建新的持久性实例
  • 返回持久化实例
  • 给定的实例不会与会话关联,它仍然是分离的

这意味着saveOrUpdate()如果您确定具有相同标识符的对象未与会话关联,则可以使用.否则你应该使用merge().

以下代码

entity=merge(entity);
saveOrUpdate(entity); 
Run Code Online (Sandbox Code Playgroud)

因为结果merge()是一个持久对象,所以它被忽略了saveOrUpdate(),所以第二行没有任何意义.