Hibernate version: 3.3
Hallo Zusammen,
zwischen zwei Objekten habe ich eine
bidirektionale 1-n-Beziehung, nun möchte ich erreichen, dass ich mit einem Befehl gleichzeitig beide Seite aktualisiere. Die Many-Seite halte ich auf der One Seite in einer Collection (in meinem Fall eine List). Den Setter der List habe ich private gemacht, damit die add- und remove-Methode genutzt wird.
Code:
@OneToMany(mappedBy="regelMeineFormel1")
@Cascade(CascadeType.MERGE)
public List<Regel> getFormel1MeineRegeln() {
return mFormel1MeineRegeln;
}
@SuppressWarnings("unused")
private void setFormel1MeineRegeln(List<Regel> prmFormel1MeineRegeln) {
mFormel1MeineRegeln = prmFormel1MeineRegeln;
}
public void addFormel1MeineRegel(Regel prmRegel){
prmRegel.setRegelMeineFormel1(this);
mFormel1MeineRegeln.add(prmRegel);
}
public void removeFormel1MeineRegel(Regel prmRegel){
mFormel1MeineRegeln.remove(prmRegel);
prmRegel.setRegelMeineFormel1(null);
}
Wenn ich nun innerhalb einer Transaktion die Änderungen auf beiden Seiten sehen möchte, funktioniert dies beim Add, wenn ich wie oben gezeigt CascadeType.MERGE nutze. Egal welches Objekt ich speichere, die andere Seite bekommt es mit. Wenn ich aber remove', dann bekommt die andere Seite dies nur mit, wenn ich die Many-Seite speichere. Meine Vermutung, dass ich auf einer Seite zusätzlich mit CascadeType.REMOVE arbeiten muss, hat sich nicht bestätigt.
Code:
//regel2.setBezeichnung("NEU_NEU_NEU");
formel2.removeFormel1MeineRegel(regel2);
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus prmStatus){
try {
mFormelDao.save(formel2);
// mRegelDao.save(regel2);
regel1 = mRegelDao.getById(2L, true, false, false);
} catch (ObjectNotFoundException e) {
e.printStackTrace();
}
assertNull(regel1.getRegelMeineFormel1());return null;
}
});
In diesem TestCase trenne ich die Beziehung zwischen
regel2 und
formel2, danach speichere ich die
formel2 innerhalb einer Transaktion. Direkt folgend lese ich das RegelObjekt wieder als
regel1 ein. Im oben gezeigten code bekomme ich aber eine
AssertionError.
Wenn ich anstelle der
formel, die
regel speichere, dann funktioniert mein TestCase. Er funktioniert auch, wenn die irgendeine Änderung an der
regel mache, dann ist es egal welche Seite ich speichere.
In Gavin King's JAVA PERSISTENCE with HIBERNATE ist er sehr sparsam mit Beschreibungen zu bidirektionalen Assoziationen. Hier wird an verschiedenen Stellen darauf hingewiesen, dass mit CascadeType.SAVE_UPDATE der gewünschte Effekt zu erzielen sei. Dies kann ich nicht bestätigen, ich bekomme beim add'en mit SAVE_UPDATE keinen Effekt, nur MERGE hilft beim add'en.
Hat jemand eine Idee?
Gruß
Andreas