hibernate envers:merge&saveOrUpdate
我正在开发一个spring-hibernate-envers应用程序。 很多谷歌搜索后的东西终于为我工作但我还有几个问题。
-
之前我使用
saveOrUpdate
来保存或更新实体。 但是当使用envers时,它会抛出一个nonUniqueObject
exception。 所以我使用了merge
而且它有效。 为此使用合并是否正确?merge
是否merge
新对象插入db? -
我试过以下代码:
entity=merge(entity); saveOrUpdate(entity);
这也有效。 这是正确的方法吗? 而且我很好奇为什么saveOrUpdate
现在没有抛出任何错误。
Hibernate Reference说:
saveOrUpdate()执行以下操作:
- 如果对象在此会话中已经持久化,则不执行任何操作
- 如果与会话关联的另一个对象具有相同的标识符,则抛出exception
- 如果对象没有标识符属性,则保存()它
- 如果对象的标识符具有分配给新实例化对象的值,则保存()它
- 如果对象是由or版本化的,并且version属性值是分配给新实例化对象的相同值,则save()它
- 否则更新()对象
和merge()是非常不同的:
- 如果存在具有当前与会话关联的相同标识符的持久实例,则将给定对象的状态复制到持久实例上
- 如果当前没有与会话关联的持久性实例,请尝试从数据库加载它,或者创建新的持久性实例
- 返回持久化实例
- 给定的实例不会与会话关联,它仍然是分离的
这意味着如果您确定具有相同标识符的对象与会话无关,则可以使用saveOrUpdate()
。 否则你应该使用merge()
。
以下代码
entity=merge(entity); saveOrUpdate(entity);
因为merge()
的结果是一个持久对象,因此它被saveOrUpdate()
忽略,所以第二行没有任何意义。
saveOrUpdate:如果请求的对象是瞬态的(空主键值),则将其保留在数据库中或更新它。 条件是会话中只有该实体的一个副本。
merge: Hibernate将首先检查持久化上下文中是否已存在该类型的Persistent实例。 它使用对象标识符来检查这种存在。 如果存在另一个实例,它会将Detached对象的状态复制到现有的Persistence对象中。 如果不存在其他实例,Hibernate只会重新附加Detached对象。
如果会话包含单个实体的多个副本,则使用最新实体更新所有副本。 在调用update之前,它不会在数据库中更新。
- JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束违规
- 使用SequenceGenerator的javax.persistence.EntityExistsException
- 使用struts 2和hibernate在jsp页面中显示Blob(图像)
- 来自HBM文件的POJO
- long类型的错误值: – Postgresql,Hibernate,Spring
- MySQLNonTransientConnectionException:连接关闭后不允许任何操作。连接
- 用于JPA回调的Hibernate事件侦听器
- Hibernate:直接在bean中设置Id或调用load()或get()方法之间的区别?
- Hibernate和@JoinFormula:org.hibernate.mapping.Formula无法强制转换为org.hibernate.mapping.Column