Hibernate的“unsaved-value mapping was incorrect”是什么意思?

20
有一个著名的例外情况:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [my.Entity#123456]
当“行被另一个事务更新或删除”时,这是一个非常熟悉的情况。
但是什么是另一种可能性 - “未保存值映射不正确”?如何有意地重现这种情况?
Grails 2.2.0
1个回答

19

关于"未保存值(unsaved-value)"的描述,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id

未保存值(可选,默认为“合理”值):表示实例是新实例(未保存),区别于在先前会话中保存或加载的分离实例的标识属性值。

Hibernate 在极少数情况下需要这个值,当 saveOrUpdate() 方法无法确定实体是新的还是分离的时候。

如果一个实体被你的未保存值确认为分离状态,但实际上是新的,则 Hibernate 就无法比较版本号(因为该实体不存在于数据库中)。但 Hibernate 不知道是你的未保存值映射不正确,还是实体已在另一个事务中被删除。这也在 org.hibernate.StaleStateException 中有所描述:

当版本号或时间戳检查失败时抛出,表明会话包含陈旧数据(使用带版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接