如何在Hibernate中保存版本字段,无论是否脏?

时间:2011-05-13 10:44:28

标签: java hibernate concurrency versioning

我正在使用Hibernate和版本列来实现乐观并发控制。

问题:每次将实体保存到数据库时是否可以增加实体的版本号,无论它是否已更改?

只要实体中的某个字段发生更改,版本号就会增加。但是,如果实体中没有更改字段,则实体的版本号保持不变。

这个问题背后的原因是我在两个表之间有一个逻辑主 - 细节关系,我想在细节发生变化时增加主表中的版本号,即使主数据没有更改。此主 - 详细信息关系未在Hibernate中映射。我只是在一次交易中将它们保存在一起。

2 个答案:

答案 0 :(得分:2)

当您确定细节已更改时,可以使用Hibernate拦截器更新主记录的版本号。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/events.html

一个限制是此解决方案特定于Hibernate。 JPA还允许使用注释的事件驱动逻辑(例如PostPersist,PostUpdate等),但这些方法不允许您访问基础会话(更重要的是,文档提醒您使用这些方法修改会话数据)。我通常使用拦截器来执行审计,但是当记录被更改时,它们可以很容易地扩展到更新版本号。

答案 1 :(得分:0)

您可以使用lock()致电LockMode(或使用LockMode.OPTIMISTIC_FORCE_INCREMENT的其他方法)。