Irgendwie bin ich schwer enttäuscht von der Dokumentation des XML-Entity-Mappings in Hibernate.
Zwar funktioniert das Beispiel mit dem "XML-Export" mittlerweile nach einem durchgearbeiteten Wochenende, aber der XML-Import funktioniert nur teilweise.
Ich kann jedes dom4j.Element wunderbar einzeln mit Hilfe von session.saveOrUpdate(...) "importieren" aber sobald es an die Beziehungen geht, scheitert Hibernate.
Worum geht es?
Ich habe zwei simple Objekte, die in einer one-to-many Beziehung bidirektional verknüpft sind, also z.B. wie im Beispiel in der Dokumentation (nur mit einem (inverse) Set statt einer Map):
Code:
<class name="Account"
table="ACCOUNTS"
node="account">
<id name="accountId"
column="ACCOUNT_ID"
node="@id"/>
<many-to-one name="customer"
column="CUSTOMER_ID"
node="customer/@id"
embed-xml="false"/>
</class>
<class name="Customer"
table="CUSTOMER"
node="customer">
<id name="id"
column="CUST_ID"
node="@id"/>
<set name="accounts"
node="."
embed-xml="true" inverse="true">
<key column="CUSTOMER_ID"
not-null="true"/>
<one-to-many entity-name="Account"
embed-xml="true"
node="account"/>
</set>
</class>
Außerdem habe ich ein XML-File, das ich importieren möchte. Dies sieht so aus wie das Output-File in der Dokumentation, nur ohne ID's (weil ich die ja beim initialen Import nicht habe)
Code:
<customer>
<account>
<customer/>
<balance>100.29</balance>
</account>
<account>
<customer/>
<balance>32.29</balance>
</account>
<account>
<customer/>
<balance>34.29</balance>
</account>
</customer>
Nun importiere ich das XML mit folgendem Codesniplet:
Code:
Session xmlsession = getSession().getSession(EntityMode.DOM4J);
xmlsession.save("Customer", doc.getRootElement());
xmlsession.flush();
(Wobei doc das dom4j.Document ist).
Am Ende vergibt er jedem einzelnen Objekt die ID (also dem Customer und dem Account) aber die Spalte CUSTOMER_ID in der Tabelle ACCOUNTS bleibt null.
Wenn ich das Customer-Objekt dann in der "normalen" Session anschauen will, dann hat er keine Accounts im Set.
Auch Hibernate.initialize() hilft hier nicht mehr weiter.
Zwar könnte ich die Objekte aufgrund ihrer Einfachheit einzeln einlesen und die Beziehung und die Properties selber zu Fuß setzen, aber wofür gibt es dann die Hibernate-XML-Mapping-Möglichkeit und wie sieht es dann mit kompliziertern Strukturen aus?
Warum kann Hibernate diese Beziehung beim Import nicht selbst lösen. Es weiß doch aus dem Mapping-File heraus, daß das Account-Element zu dem Customer im Parent-Element gehört...
Robert