什么意味着Hibernate"未保存的值映射不正确"?

时间:2014-07-18 14:35:37

标签: hibernate gorm

有一个着名的例外:

  

org.hibernate.StaleObjectStateException:行已更新或删除   另一个事务(或未保存的值映射不正确):[my.Entity#123456]

当“行被另一个事务更新或删除”时,这是一种非常熟悉的情况。

但是什么意味着另一种可能性 - “未保存的值映射是不正确的”?如何故意重现这种情况?

Grails 2.2.0

1 个答案:

答案 0 :(得分:12)

有关未保存值的说明,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id

  

unsaved-value(可选 - 默认为"敏感"值):a   标识符属性值,表示实例是新的   实例化(未保存),将其与分离的实例区分开来   在之前的会话中保存或加载。

在很少的情况下,当saveOrUpdate()无法确定实体是新实体还是分离实体时,Hibernate需要这样做。

如果实体是通过未保存的值确定为已分离的,而是新的,则休眠不能比较版本号(因为实体不存在于数据库中)。但是,Hibernate无法知道您的未保存值映射是否正确,或者实体是否已在另一个事务中被删除。这在org.hibernate.StaleStateException中也有描述:

  

当版本号或时间戳检查失败时抛出,指示   Session包含过时数据(使用长事务时)   版本化)。如果我们尝试删除或更新一行,也会发生   不存在。