1

JPAプロバイダーとしてEclipseLinkを使用しています。親オブジェクトで子が追加/削除されるたびにバージョン属性が更新されないという問題に直面しています。

クラス会社があります。Company クラスにはプロパティ Set があります。Company クラスのバージョン フィールド。非関係属性を更新するたびに、Company インスタンスのバージョン フィールドがインクリメントされます。ただし、Employee クラスのインスタンスを 1 対多のコレクションの従業員に追加すると、Company インスタンスのバージョン フィールドはインクリメントされません。基本的に、親オブジェクトに子が追加または削除された場合、親のバージョンはインクリメントされません。

@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 に答える