2014-07-18 37 views
9

有一种著名的例外:Hibernate的“未保存值映射不正确”是什么意思?

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

当“行由其他事务更新或删除”时,这是非常熟悉的情况。

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

的Grails 2.2.0

回答

6

对于未保存值的描述见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id

未保存值(可选 - 默认为一个“明智”值):一个 标识属性值,其指示一个实例最近被实例化(未保存) ,将它与在先前会话中保存或加载的分离实例区分开来。

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

如果一个实体是通过未保存值的方式确定为已分离的,而不是新的,那么hibernate无法比较版本号(因为实体在数据库中不存在)。但是Hibernate无法知道你的未保存值映射是否正确,或者实体是否在另一个事务中被删除。这在org.hibernate.StaleStateException以及描述:当一个版本号或时间戳检查失败,指示 所述会话包含陈旧的数据(使用长事务 与版本时)

抛出。如果我们尝试删除或更新 不存在的行,也会发生。