我正在使用Hibernate和版本列来实现乐观并发控制。
问题:每次将实体保存到数据库时是否可以增加实体的版本号,无论它是否已更改?
只要实体中的某个字段发生更改,版本号就会增加。但是,如果实体中没有更改字段,则实体的版本号保持不变。
这个问题背后的原因是我在两个表之间有一个逻辑主 - 细节关系,我想在细节发生变化时增加主表中的版本号,即使主数据没有更改。此主 - 详细信息关系未在Hibernate中映射。我只是在一次交易中将它们保存在一起。
答案 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
的其他方法)。