我目前正在我的项目中进行乐观锁定管理。我们使用 JPA 2.0 (hibernate-jpa2.0-api-1.0.1.Final),数据源由 JBoss 7 提供。
我做了什么
在我的实体“AccordSimple”中,我使用@Version 注释:
@Entity
@Table(name = "AccordSimple")
public class AccordSimple {
@Id
@SequenceGenerator(name = "parametresubsidesequence",
sequenceName = "parametresubsidesequence", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "parametresubsidesequence")
private Long id;
// Optimistic lock.
@Version
private Long version;
}
这是我的 AccordServiceImpl
public AccordDTO updateAccord(AccordDTO accordDTO) throws AppException {
AccordSimple accord = getAccordRepository().findByReference(
accordDTO.getAccordReference());
if (accord == null) {
return null;
}
// copy new values from the DTO...
accord.setVariable(accordDTO.getVariable());
// ...
// Set the version from the DTO (old version if someone changes before me!)
accord.setVersion(accordDTO.getVersion());
getAccordRepository().merge(accord);
return accordDTO;
}
这样,不会抛出 OptimisticLockException。即使合并前一致的版本包含在我的数据库中的版本之下。
我已经找到了原因。这是负责人:
AccordSimple accord = getAccordRepository().findByReference(
accordDTO.getAccordReference());
因为如果我将方法更改为:
public AccordDTO updateAccord(AccordDTO accordDTO) throws AppException {
AccordSimple accord = new AccordSimple(accordDTO.getAccordReference(), accordDTO.getVersion());
// copy new values from the DTO...
accord.setVariable(accordDTO.getVariable());
// ...
// Set the version from the DTO (old version if someone changes before me!)
accord.setVersion(accordDTO.getVersion());
getAccordRepository().merge(accord);
return accordDTO;
}
将抛出 OptimisticLockException!
问题
该版本来自 Hibernate 缓存,而不是来自我的 DTO。因此,如果我分离实体,那么一切都会正常工作(我猜),但我不想这样做(如果开发人员忘记它,则会出现错误的来源......)。
你有什么想法吗?