使用Hibernate 4.1.0提供的Spring 3.1/JPA 2。Hibernate/JPA @Version和@Generated导致StaleObjectStateException
我对我所有的实体,它提供基本的审计能力(更新时间戳,版本号等),因为其他应用程序访问我们的数据库,这些必须通过触发器设置的基类。
我的映射是这样的:
public abstract class AbstractBaseModel implements Serializable {
@Version
@Generated(GenerationTime.ALWAYS)
@Column(name = "VERSION", insertable = false, updatable = false)
protected Long version;
@Generated(GenerationTime.ALWAYS)
@Column(name = "UPDATE_TIMESTAMP", insertable = false, updatable = false)
protected Date updateDate;
...
}
的org.hibernate.engine.internal.increment(...)
方法提交事务时总是叫 - 在一个StaleObjectStateException
结果。
奇怪的是,如果我上的版本列设置GenerationTime.NEVER
,休眠还是递增的版本,但仍然存在正常。问题是,即使数据库中的版本没有得到更新(例如,表中没有更改),从合并返回的版本也会比数据库值高1,这显然会导致后续保存时出现问题。
我的期望是GenerationTime.ALWAYS
会告诉hibernate永远不会尝试增加版本并依赖数据库来完成,然后在插入/更新后选择更新后的值。
有谁能告诉我我的理解和实施出了什么问题吗?
哦,我多么希望你解决了我的问题,但可悲的是。这与'@ Version'和'@ Generated'具有相同的行为。它会始终尝试增加刷新之前的版本并导致乐观锁定异常。我只想让hibernate不尝试增加标记为“@ Generated”的字段总是......不知道这是否是Oracle特定的问题,但我完全被困住了。 – Ben 2012-04-30 16:53:03
这确实很奇怪:这段代码已经在我们的生产环境中运行了几个月,没有任何问题。我很抱歉,我无法帮助你,我真的认为它会解决你的问题... – LeChe 2012-05-11 19:10:44