Hibernate replicate mit DOM4J bidirectional one-to-many bringt Fehler

alvarano

Grünschnabel
Hallo,
ich möchte Daten von einer Datenbank per Hibernate DOM4J Export exportieren und sie anschliessend in einer anderen Datenbank wieder importieren. Der Export funktioniert auch tadellos. Beim Import kommt es jedoch zu folgendem Fehler:

Code:
org.hibernate.PropertyValueException: not-null property references a null or transient value: de.test.Foo.bar

Bei dieser Verbindung handelt es sich um eine bidirectionale one-to-many Verknüpfung, welche wie folgt konfiguriert ist:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
    <class name="de.test.Foo" table="foo" node="foo">
        <id name="id" column="id" type="long" node="@id">
            <generator class="increment"/>
        </id>
        <bag name="bars" cascade="replicate,all-delete-orphan" lazy="true" inverse="true" node="." embed-xml="true">
          <key column="fooId"/>
          <one-to-many class="de.test.Bar" node="bar" embed-xml="true"/>
        </bag>
        ...

und

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
    <class name="de.test.Bar" table="bar" node="bar">
        <id name="id" column="id" type="long" node="@id">
            <generator class="increment"/>
        </id>
        <many-to-one name="foo" column="fooId" lazy="no-proxy" not-null="true" embed-xml="false" node="foo/@id"/>
         ...

Zum inportieren der Daten benutze ich folgenden Code:

Code:
        InputStream is = null;
        Transaction t  = null;

        try {
           is = new FileInputStream(fileName);

            SAXReader reader  = new SAXReader();
            Document  doc     = reader.read(is);

            Session s = getSession().getSession(EntityMode.DOM4J);
            t = s.beginTransaction();

            List     elems = doc.getRootElement().elements();
            Iterator it    = elems.iterator();

            while (it.hasNext()) {
                Element e = (Element) it.next();

                if (e.getName().equals("foo"))
                    s.replicate(Foo.class.getName(), e, ReplicationMode.OVERWRITE);
            ...

Das zu importierende xml sieht vereinfacht folgendermaßen aus:

Code:
<?xml version="1.0" encoding="UTF-8"?>

<root>
  <foo id="1">
    <bar id="1">
      <text>test</text>
    </bar>
  </foo>
</root>

Ich hab mich nun etwas durch den Hibernate Code debugged und hab festgestellt, dass er foo/@id nicht auflösen kann. Er ruft auf dem DOM4J Element von Bar die Methode element("foo") auf, welche aber nur Kindknoten zurückliefern kann. Foo ist aber das Elternelement von bar und wird somit nicht gefunden. Das führt dann zu dem Fehler das Bar.foo null ist. Ich bin für alle Hilfe sehr dankbar ...

Laut hibernate doku (http://docs.jboss.org/hibernate/stable/core/reference/en/html/xml.html)
soll man ja auch mit "." auf das Elternelement referenzieren können. Das klappt bei mir leider auch nicht.

Ich verwende:
hibernate in Version 3.3.1
dom4j in Version 1.6.1

Gruß,
alvarano
 
Nachdem ich noch etwas gesucht habe, konnte ich eine Lösung für mein Problem finden.

Code:
<bag name="bars" cascade="replicate,all-delete-orphan" lazy="true" inverse="true" node="." embed-xml="true">

muss mit

Code:
<bag name="bars" cascade="replicate,all-delete-orphan" lazy="true" inverse="true" node="." embed-xml="false">

ersetzt werden. Dann funktioniert es auch ...
 

Neue Beiträge

Zurück