使用 Hibernate 4.1.0 提供的 Spring 3.1/JPA 2。
我的所有实体都有一个基类,它提供基本的审计功能(更新时间戳、版本号等)。因为其他应用程序访问我们的数据库,这些必须通过触发器设置。
我的映射看起来像:
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永远不要尝试增加版本并依赖数据库来这样做,然后在插入/更新之后选择更新的值。
谁能告诉我我的理解和实施哪里出了问题?