私はebeanのモデルを更新していますが、モデルへの他の参照は変更されていないという問題があります。 結合された列または@ManyToManyマッピングを使用して、更新されたモデルを参照するモデルを自動的に更新または更新することができるかどうかは疑問でした。ebean ormのすべての参照を更新するには
これは私のテストコードです:
// Create students and club
Student john = new Student("John");
Student lizz = new Student("Lizz");
Club soccer = new Club("Soccer");
// Save the students
server.save(john);
server.save(lizz);
// Add them to their club
john.getClubs().add(soccer);
server.save(john);
lizz.getClubs().add(soccer);
server.save(lizz);
// Reload users (fresh)
john = server.find(Student.class).where().ieq("name", "john").findUnique();
lizz = server.find(Student.class).where().ieq("name", "lizz").findUnique();
System.out.println("Club: " + lizz.getClubs().get(0).getName());
// Modify the club name
john.getClubs().get(0).setName("Baseball");
System.out.println("Club: " + lizz.getClubs().get(0).getName());
// Update the club
server.save(john);
System.out.println("Club: " + lizz.getClubs().get(0).getName());
、これらは私のモデルです:
@Entity
@Table(name = "students")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, updatable = false)
private int id;
@Column
private String name;
@ManyToMany(mappedBy = "students", cascade = CascadeType.ALL)
private List<Club> clubs;
@Version
private long version;
}
と:
@Entity
@Table(name = "clubs")
public class Club {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, updatable = false)
private int id;
@Column
private String name;
@ManyToMany
@JoinColumn
private List<Student> students;
@Version
private long version;
}
出力は、クラブがそうのように、サッカーのように残っていることですクラブ:サッカー
クラブ:サッカー
クラブ:サッカー
コードがjohnとlizzをリロードすると、スパニングトランザクション/永続コンテキストが存在しないため、2つの独立したオブジェクトグラフが作成されます。これらのオブジェクト・グラフは、ある時点の特定の分離レベル(JPA仕様などに基づいてデフォルトでコミットされた読取り)でのデータベースの一部のスナップショットを表します。 –
@RobBygraveは意味があります。分離レベルをSERIALIZABLEに設定します。 常に同じ参照を保持することは可能ですか? – lenis0012
SERIALIZABLEオプティミスティック並行性チェックは機能しません(チェックはトランザクションの開始からの相対的なものです)。一般的には、SERIALIZABLEで悲観的なロックを使い始める必要があります。並行性が問題となるアプリケーションのために、READ_COMMITTEDはIMOよりはるかに良い選択です... –