Hallo,…
Ich habe eine bidirektionale One-To-Many Beziehung zwischen Stadt (One) und Person (Many). (Beide Entitys haben eine Versionierung)
Nun möchte ich, dass sich die Version beider Entitys ändert, wenn ich aus der Liste einer Stadt eine Person wegnehme. (Standardmäßig wird nur der Owner, also die Person, hochgezählt)
Ein weiterer Punkt ist (oder auch ein Bug?), dass ich sozusagen versucht habe, das Verhalten via em.lock(stadt, LockModeType.OPTIMISTIC_FORCE_INCREMENT)
in der Update- Methode zu erzwingen. Hier ist das komische, dass dieser Befehl nicht mehr funktioniert, sobald ich eine Person aus der Stadt entferne,… kommentiere ich den remove- Teil aus, wird die Version der Stadt hochgezählt.
Zusammengefasst: Ich möchte, dass beide Seiten der Beziehung hochgezählt werden, sobald ich die Liste verändere. Leider finde ich irgendwie kaum was zu dem konkreten Thema (beide Seiten hochzählen), besonders nicht zu OpenJPA. (EclipseLink / Hibernate bieten da etwas mehr Möglichkeiten)
Ich benutze übrigens OpenJPA 2.2.1.
Hier mal mein Beispiel- Code:
Stadt:
public class Stadt implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqStadt")
@SequenceGenerator(name = "seqStadt", sequenceName = "stadtSeq")
private Long id;
@Version
private Long version;
@Column(nullable = true, unique = true)
private String name;
@OneToMany(mappedBy = "stadt", cascade = CascadeType.ALL)
private List<Person> persons;
/**GETTER & SETTER*/
Person:
public class Person implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="seqGenerator")
@SequenceGenerator(name="seqGenerator",sequenceName="personSeq")
private Long id;
@Version
private Long version;
@ManyToOne()
private Stadt stadt;
@Column(nullable=true, unique=true)
private String name;
/** GETTER & SETTER*/
```
```public class Starter implements Serializable {
private static EntityManager em;
public static void main(String[] args) {
em = Persistence.createEntityManagerFactory("openjpa")
.createEntityManager();
Person person1 = new Person("Person");
Person person2 = new Person("Person2");
Stadt stadt = new Stadt("Stadt");
stadt.addPerson(person1);
stadt.addPerson(person2);
savePerson(stadt);
em.clear();
showDetails();
updateStadt(stadt.getId());
em.clear();
System.out.println();
showDetails();
}
private static void updateStadt(Long id){
em.getTransaction().begin();
Stadt stadt = em.find(Stadt.class, id);
Person p = stadt.getPersons().get(0);
stadt.getPersons().remove(p);
p.setStadt(null);
em.getTransaction().commit();
}
private static void savePerson(Object o){
em.getTransaction().begin();
em.persist(o);
em.getTransaction().commit();
}
private static void showDetails() {
List<Stadt> stadtListe = em.createQuery("select s from Stadt s",Stadt.class).getResultList();
for(Stadt s : stadtListe){
System.out.println(s);
}
List<Person> personListe = em.createQuery("select p from Person p",Person.class).getResultList();
for(Person p : personListe){
System.out.println(p);
}
}
}```
Ausgabe (Die Zahl ist die Versionsnummer):
Stadt: Stadt 1
Person: Person 1
Person: Person2 1
Stadt: Stadt 1
Person: Person2 1
Person: Person 2