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

Pav*_*sov 12 hibernate grails-orm

有一个着名的例外:

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

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

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

Grails 2.2.0

Mir*_*ina 12

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

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

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

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

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