有一个著名的例外:
org.hibernate.StaleObjectStateException:行已更新或删除
另一笔交易(或未保存值映射不正确):[my.Entity#123456]
当“行被另一个事务更新或删除”时,这是一种非常熟悉的情况。
但是另一种可能性——“未保存值映射不正确”意味着什么?又如何刻意重现这样的情况呢?
Grails 2.2.0
有关未保存值的说明,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-id:
未保存值(可选 - 默认为“合理”值):
指示实例是新的标识符属性值
实例化(未保存),将其与独立实例区分开来
在上一个会话中保存或加载。
在极少数情况下,当 saveOrUpdate() 无法确定实体是新实体还是分离实体时,Hibernate 需要这样做。
如果通过未保存的值确定一个实体是分离的,而是新的,则 hibernate 无法比较版本号(因为该实体在数据库中不存在)。但是 Hibernate 无法知道您的未保存值映射是否不正确,或者该实体是否已在另一个事务中被删除。 org.hibernate.StaleStateException 中也对此进行了描述:
当版本号或时间戳检查失败时抛出,表示
会话包含过时的数据(当使用长事务时
与版本控制)。如果我们尝试删除或更新一行,也会发生这种情况
不存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)