Ich habe ein Problem, wo ich ein Modell in Ebean aktualisieren, aber andere Verweise auf das Modell werden nicht geändert. Ich habe mich gefragt, ob es möglich ist, automatisch alle Modelle zu aktualisieren oder zu aktualisieren, die auf das aktualisierte Modell verweisen, indem sie verknüpfte Spalten oder @ManyToMany-Zuordnungen verwenden.Wie aktualisiert man alle Referenzen in Ebean ORM
Dies ist mein Testcode:
// 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());
und das sind meine Modelle:
@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;
}
und:
@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;
}
Der Ausgang der Club ist wie Fußball bleibt, wie so :
Verein: Fußball
Verein: Fußball
Verein: Fußball
Wenn der Code John und Lizz ... neu lädt, da es keinen übergreifenden Transaktion/Persistenzkontext gibt ... das erstellt 2 unabhängige Objektdiagramme. Diese Objektgraphen stellen einen "Schnappschuss eines Teils der Datenbank zu einem bestimmten Zeitpunkt und auf einer bestimmten Isolationsstufe dar (gelesen gemäß der JPA-Spezifikation usw.). –
@RobBygrave das macht Sinn, ich setze die Isolationsstufe auf SERIALIZABLE weil Es unterstützt sowohl SQLite und MySQL, einige andere nicht Ist es möglich, immer die gleiche Referenz zu halten? – lenis0012
Bei SERIALIZABLE Optimistische Parallelitätsprüfung funktioniert nicht (gut, die Überprüfung ist relativ zum Beginn der Transaktion). Im Allgemeinen müssen Sie pessimistisches Sperren bei SERIALIZABLE starten, für eine Anwendung mit hohem Nebenläufigkeit ist das ein Problem, also ist READ_COMMITTED IMO eine viel viel bessere Wahl, es sei denn ... –