Hibernate version: 3.2.3.ga
Tach zusammen,
wir setzen Hibernate gemeinsam mit EJB 2 SessionBeans mehr oder weniger erfolgreich ein. Solange wir uns nur innerhalb einer Session bewegen funktioniert alles tadellos.
Nun habe ich folgendes Problem (unten gibt's Code-Snippets):
1. ich erzeuge ein POJO A
2. A erhält ein assoziiertes Objekt B (persistent, per Query gefunden, ohne nachgeladene Assoziation C)
3. remote übertragen und per Session#save speichern
Resultat: Es wird die Assoziation B zu C gelöscht. Klar, weil in dem Attribut B#c null steht.
Nun die Idee: Kann ich Hibernate irgendwie sagen, dass es bei einem Session#save oder Session#merge bestimmte Attribute nur updaten soll, wenn diese als "dirty" markiert sind? bspw. über B#isCDirty. Ggf. könnte ich auch eine Art Interceptor einbauen. Nur habe ich bei dem Interceptor keine Idee, wie ich Hibernate sagen kann "und das Attribute jetzt nicht speichern"...
Hoffentlich geht's...
sMArtin
Testcode:
Code:
A a = new A();
a.setName("Herbert");
// dieses B hat kein geladenes C, obwohl es in der DB ein C gibt
B b = myRemoteService.findB();
a.setB(b);
myRemoteService.createA(a);
A actual = myRemoteService.findA();
assertNotNull(actual); // ist ok
assertNotNull(actual.getB()); // ist ok
assertNotNull(actual.getB().getC()); // schlägt fehl!
A.java
Code:
public class A {
private String name;
private B b;
private boolean isBDirty = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
this.isBDirty = true;
}
public boolean isBDirty() {
return this.isBDirty;
}
}
B.java
Code:
public class B {
private String name;
private C c;
private boolean isCDirty = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
this.isCDirty = true;
}
public boolean isCDirty() {
return this.isCDirty;
}
}