1

我使用 EclipseLink 作为 JPA 提供程序。每当在父对象中添加/删除子对象时,我都面临版本属性未更新的问题。

有一类公司。Company 类有一个属性 Set。公司类一个版本字段。每当我更新任何非关系属性时,公司实例的版本字段都会增加。但是,如果我将 Employee 类的实例添加到一对多集合员工中,则 Company 实例的 version 字段不会增加。基本上,如果将子对象添加到父对象或从父对象中删除,则父对象的版本不会增加。

@Entity
class Company {
   @Id
   private long id;
   private String name;
   @Version
   private Integer version;
   @OneToMany(mappyedBy="company", cascade = CascadeType.ALL, orphanRemoval = true)
   private Set<Employee> employees;
   //
   // setter / getter methods
}

@Entity
class Employee {
   @Id
   private long id;
   private String name;
   @ManyToOne
   @JoinColumn(name = "compid")
   private Company company; 
   //
   // setter / getter methods
}

如果将子对象添加到父对象或从父对象中删除,则 Hibernate 会增加父对象的版本。

EclipseLink 不应该以同样的方式表现吗?我错过了什么吗?

提前致谢。

4

1 回答 1

2

默认情况下,每当任何直接字段或“拥有”关系发生变化时,EclipseLink 都会增加锁定。我相信这是 JPA 规范所规定的。使用“mappedBy”的 OneToMany 不被视为拥有关系,因此默认情况下不会导致版本增加。

您可以使用来配置它,(导致对任何关系或依赖对象的任何更改以增加版本)

@OptimisticLocking(cascade=true)

您还可以使用 DescriptorCustomizer 进行设置,(导致对任何关系的任何更改以递增版本)

descriptor.getOptimisticLockingPolicy().setLockOnChangeMode(LockOnChange.ALL)
于 2012-12-05T13:54:01.080 回答