Hallo!
Ich hänge hier gerade an einem wirklich trivialen Problem - aber ich komme einfach nicht weiter.
Ärgert mich sehr und ich habe wirklich schon viel gesucht / geändert - aber es geht einfach nicht.
Mein Fall (in Klassen):
class Parent {
private Long parent_id ;
private Set<Child> getChildren() ;
...
}
class Child {
private Long child_id ;
private ChildType getChildType() ;
private Parent getParent() ;
...
}
class ChildType {
private Long child_type_id ;
private Set<Child> getChildren() ;
...
}
Alle IDs sind Sequenzen, müssen also durch Hibernate vergeben werden.
Meine Mappings:
<class name="Parent" table="parent">
<id name="addressId" type="java.lang.Long">
<column name="parent_id" />
<generator class="native">
<param name="sequence">parent_id_seq</param>
</generator>
</id>
<set name="childrens" inverse="true" cascade="all-delete-orphan" fetch="join">
<key>
<column name="parent_id" not-null="true" />
</key>
<one-to-many class="Child" />
</set>
...
</class>
<class name="Child" table="child">
<id name=... wie oben ....
</id>
<many-to-one name="parent" class="Parent" update="false" insert="false" fetch="select" cascade="all">
<column name="parent_id" not-null="true" />
</many-to-one>
<many-to-one name="childType" class="ChildType" update="false" insert="false" fetch="select" cascade="all">
<column name="child_type_id" length="20" not-null="true" />
</many-to-one>
...
</class>
<class name="ChildType" table="child_type">
<id name=...wie oben...
</id>
<set name="childrens" inverse="true" cascade="save-update">
<key>
<column name="child_id" length="20" not-null="true" />
</key>
<one-to-many class="Child" />
</set>
...
</class>
Was mir Probleme bereitet:
Parent parent = new Parent() ;
Child child = new Child() ;
ChildType childType = getChildTypeFromDb(...) ;
child.setChildType(childType) ;
childType.getChildren().add(child) ;
child.setParent(parent) ;
parent.getChildren().add(child) ;
session.save(parent) ;
Wirft mir eine Exception, dass in die Tabelle child keine parent_id mit null eingefügt werden kann.
Ist eigentlich klar, wenn ich mir das SQL anschaue, welches Hibernate an die Datenbank schicken will:
insert into child (child_id) values (1) ;
Das kann nicht gut gehen. :-)
Ich dachte eigentlich, Hibernate kümmert sich in solchen Fällen um die richtige Reihefolge beim insert/update (wegen all-delete-orphan, bzw. all als cascade-Eigenschaft) ?
Macht es das nicht ? Oder habe ich einen Fehler im Mapping (was dann mein Denkfehler wäre).
Wäre super, wenn einer über das lange Beispiel schauen könnte - ich bin hier fast am Durchdrehen :(
Ich hoffe ich habe beim Vereinfachen keine Tipp/Logikfehler eingebaut.
Vielen Dank !!
Gruß,
Gary
|