2012-03-20 93 views
1

使用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永远不会尝试增加版本并依赖数据库来完成,然后在插入/更新后选择更新后的值。

有谁能告诉我我的理解和实施出了什么问题吗?

回答

0

我没有你的实际问题的答案,但我确实有你的问题的解决方案。 :)

在Hibernate中,它是完全有效的做到这一点:

@Version 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "UPDATE_TIMESTAMP" 
private Date updateDate; 

这会让你的更新日期的版本了。这既是精简的,也是为实体上的每一次合并自动更新它。顺便说一下:我建议让会员私人并将get ters和set ters添加到课程中。

+0

哦,我多么希望你解决了我的问题,但可悲的是。这与'@ Version'和'@ Generated'具有相同的行为。它会始终尝试增加刷新之前的版本并导致乐观锁定异常。我只想让hibernate不尝试增加标记为“@ Generated”的字段总是......不知道这是否是Oracle特定的问题,但我完全被困住了。 – Ben 2012-04-30 16:53:03

+0

这确实很奇怪:这段代码已经在我们的生产环境中运行了几个月,没有任何问题。我很抱歉,我无法帮助你,我真的认为它会解决你的问题... – LeChe 2012-05-11 19:10:44