-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 10 posts ] 
Author Message
 Post subject: Parent/Child Beziehung expilizites speichern von Child nöti
PostPosted: Tue Oct 18, 2005 5:22 am 
Newbie

Joined: Mon Jan 10, 2005 9:16 am
Posts: 18
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hallo,

ich habe mal eine Parent/Child Beziehung wie in der Doku beschrieben modelliert. Doch ich muss immer den save aufruf für das Child expizit aufrufen. Laut Doku reicht ja ein save auf das Parent object, wenn das Child dem Parent hinzugefügt wurde. Bei mir funktioniert das Beispiel aus der Doku nur dann wenn ich ein Parentobjekt aus der Datenbank lese und dann ein Child hinzufüge. Bei der Neuanlage eines Parentobjektes jedoch nicht. Ich muss zuerst ein Parentobjekt abspeichern es dann auslesen und ein Child hinzufügen und dann ein save auf das Child ausführen. Ist das richtig so?

Was mach ich den falsch?

Hibernate version: 3.0.5

Mapping documents:
<set name="children" inverse="true">
<key column="parent_id" not-null="true"/>
<one-to-many class="Child"/>
</set>

<many-to-one name="parent" column="parent_id" not-null="true"/>

Code between sessionFactory.openSession() and session.close():
Parent p = new Parent();
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 3:05 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Bin mir zwar nicht sicher obs hilft, aber probiert mal bei deiner many-to-one beziehung cascade="save-update" zu setzen.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 3:39 am 
Newbie

Joined: Mon Jan 10, 2005 9:16 am
Posts: 18
Ich hab schon alle cascading options ausprobiert. Das Problem ist ja auch nur dann da wenn man ein Parentobjekt neu anlegt. Wenn ein Parentobjekt aus der Datenbank gelesen wird funktionierts ja. Meiner Meinung nach sollte es so funktionieren.

Code:
Parent p = new Parent();
Child c = new Child();
p.getChildren().add(c);
session.save(p);
session.flush();


Wenn man das Parentobjekt anlegt und ein save darauf macht muss auch das Child in die Datenbank geschrieben werden. Ich habe gemerkt, dass in dieser Konstellation auch die saveOrUpdate() Methode nicht funktioniert.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 4:52 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Vielleicht mal mit den Schritten aus "Example: Parent/child relationship" in der Referenzdokumentation vergleichen.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 5:01 am 
Newbie

Joined: Mon Jan 10, 2005 9:16 am
Posts: 18
Genauso hab ichs gemacht. Meine Mappings sehen genauso aus wie in der Reference doku. Teilweise funktionierts ja auch. Beispielsweise werden alle Childs gelöscht wenn ich das Parentobjekt lösche.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 5:10 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Noe, in der Referenz steht der Code bestimmt nicht. Z.b. steht da garantiert dass man fuer eine bidirektionale Assoziation auch beide Zeiger setzen muss, nicht nur einen. Dir fehlt also schonmal (abgesehen von cascade Optionen, die nuetzlich sind) mindestens ein c.setParent(p) zusaetzlich zu p.getChildren().add(c).


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 5:44 am 
Newbie

Joined: Mon Jan 10, 2005 9:16 am
Posts: 18
Danke für die Tipps. Die Zuweisung c.setParent(c) mache ich in der add Mehtode der Parent Klasse, wie in der Referencedoku beschrieben.
Anbei mein Mapping das ich mit XDOCLET gerneriert habe.

Müsste es so funktionieren?

Code:
<many-to-one
name="parent"
class="Parent"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="PARENT_ID"
not-null="true"
/>

<set name="child" lazy="false" inverse="true"
cascade="all" sort="unsorted">
<key
column="PARENT_ID">
</key>

<one-to-many class="Child" />

</set>


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 6:02 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Code:
Parent p = new Parent();
Child c = new Child();
p.getChildren().add(c);
session.save(p);
session.flush();


Dann war das also garnicht der code den du ausfuehrst?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 7:02 am 
Newbie

Joined: Mon Jan 10, 2005 9:16 am
Posts: 18
Doch das ist der Code den ich ausführe, ich habe Ihn nur ein bischen vereinfacht.
Code:

Parent p = new Parent();
Child c = new Child();
p.addChild(c);
c.setParent(p);
session.save(p);

Transaction transaction = session.beginTransaction();

      if (p != null) {

         session.save(p);
      }
transaction.commit();



Das ganze funktioniert

1. Wenn man das Parentobject aus der datenbank liest
2. und dann das Childobject hinzufügt und dann ein save auf das child object ausführt(Es wird ein Insert in die Child Tabelle ausgeführt)

Das ganze funktioniert nicht wenn
1. Das Parentobject neu angelegt wird
2. Wenn ein save nur auf das Parentobject ausgeführt wird. Es muss ein expizites save auf das Childobject ausgeführt werden. (Sonst wird kein Insert in die Child Tabelle ausgeführt sonder nur ein Update)

Deshalb funktioniert mein obiger code nicht, sondern nur dann, wenn bereits das Parentobject in der Datenbank existiert. Bei der Neuanlage nicht.

Grüsse


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 19, 2005 7:44 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Ich bin der Meinung dass du der Referenzdokumentation Schritt fuer Schritt folgen solltest. Der Sinn hier ist zu _verstehen_ was die ganzen Sachen tun, also was cascade, inverse, save, update, saveOrUpdate, etc. bedeuten. Trial & Error ist hier die schlechteste Strategie.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 10 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.