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:
Bei dieser Verbindung handelt es sich um eine bidirectionale one-to-many Verknüpfung, welche wie folgt konfiguriert ist:
und
Zum inportieren der Daten benutze ich folgenden Code:
Das zu importierende xml sieht vereinfacht folgendermaßen aus:
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
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