-->
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.  [ 4 posts ] 
Author Message
 Post subject: Many2Many lesen unvollständig
PostPosted: Fri Feb 12, 2010 6:14 am 
Newbie

Joined: Fri Feb 12, 2010 5:48 am
Posts: 2
Hallo grüß euch!

Nach langer suche und ausgiebiger google-befragung wende ich mich nun an euch.

problem:
Probier grad an der many2many funktionalität herum. folgendes szenario versuche ich zu realisieren bzw. zu verstehen:

Subject *-----* Tag. klar da brauchts eine tabelle link(subjectid, tagid).
Tag.getSubjects() soll alle zugehörigen tags liefern
Subject.getTags() soll alle zugehörigen subjects liefern

meine realisierung:
hab in der mappingxml folgendes stehen
Code:
<hibernate-mapping>
   <class name="Tag" table="tag">
      <id name="Id" type="long" column="tagID" ><generator class="increment"/></id>
      <discriminator column="type" type="string" />
      <set name="subjects" table="link" cascade="all">
         <key column="tagID" />
         <many-to-many class="Subject" column="subjectID"/>   
      </set>
      <property name="value" column="value"/>
      <subclass name="Tag1" discriminator-value="tag1" />
      <subclass name="Tag2" discriminator-value="tag2" />
   </class>
   
   <class name="Subject" table="subject">
      <id name="Id" type="long" column="subjectID"><generator class="increment" /></id>
      <property name="value" column="value" />
      <set name="tags" table="link" cascade="all">
         <key column="subjectID" />
         <many-to-many class="Tag" column="tagID"/>
      </set>
   </class>
</hibernate-mapping>


was funktioniert:
wie erwartet funktionieren folgende dinge:
Code:
subject2.addTag(tag1);
tag1.addSubject(subject1);

in der tabelle link sind danach 2 Einträge ((tag1, subject1),(tag1, subject2)).

was nicht wirklich funktioniert:
Code:
Criteria crit = session.createCriteria(Tag.class);
for(Object it : crit.list()) {
   Tag myTag = (Tag) it;
   System.out.println("object: " + myTag.toString());
   System.out.println("subjects: " + myTag.getSubjects().toString());
}

ergibt für tag1 ein set mit ausschließlich subject1.

und das ist der punkt an dem ich anstehe. warum nur eines der beiden records in link ausgeführt wird. kann mir hier jemand helfen das problem in den griff zu bekommen bzw zu verstehen?

ich dank euch
mfg ubootfanat


Top
 Profile  
 
 Post subject: Re: Many2Many lesen unvollständig
PostPosted: Fri Feb 12, 2010 8:42 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Laut Hibernate Documentation muss bei bidirectionalen ManyToMany Beziehungen eine Seite als invers deklariert werden.
Dies fehlt in deinem Mapping.


Top
 Profile  
 
 Post subject: Re: Many2Many lesen unvollständig
PostPosted: Sun Feb 14, 2010 9:43 am 
Newbie

Joined: Fri Feb 12, 2010 5:48 am
Posts: 2
Danke für den Tip. Ich habe das aber versucht und musste feststellen, dass das Speichern dann nicht funktioniert. Ich kann zwar mit zb Tag.add ein Subject zuordnen nicht aber mit subject.add(tag). Letzteres ergibt keinen Eintrag in der link-Tabelle.

Mein Problem hat sich jetzt allerdings etwas verschoben. Ich habe mir eine Spielwiese in Form von JUnit4 zurechtgelegt. Dort habe ich in einem Testcase zuerst die Tags und Subjects erstellt und verbunden mit session.save(tags/subjects) und danach lese ich aus der Datenbank. Ratlosigkeit führte dazu, dass ich ohne viel Hoffnung den save-Teil auskommentiert und die Datenbank nicht gelöscht habe. Und siehe da, alles wird korrekt eingelesen. Die many2many funktioniert einwandfrei. Nur wehe ich speichere davor irgendwas.

Ich habe dann probiert die session nach dem speichern zu schließen und wieder zu öffnen, hab eine transaction eingeführt, session.flush() alles mögliche was mir eingefallen ist, doch das Ergebnis bleibt gleich.

kennt jemand diese Situation? und einen Ausweg?

Danke schon einmal
ubootfanat


Top
 Profile  
 
 Post subject: Re: Many2Many lesen unvollständig
PostPosted: Mon Feb 15, 2010 3:23 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Quote:
Danke für den Tip. Ich habe das aber versucht und musste feststellen, dass das Speichern dann nicht funktioniert. Ich kann zwar mit zb Tag.add ein Subject zuordnen nicht aber mit subject.add(tag). Letzteres ergibt keinen Eintrag in der link-Tabelle.


Hm, da herscht noch grosser Aufklaerungsbedarf bzg. bidirectionaler ManyToMany, also Schritt fuer Schritt:

1. bei bidirectionalen ManyToMany Beziehungen MUSS UNBEDINGT eine Seite als invers deklariert werden.
Dies ist noetig um Hiberante vestehen zu geben, dass es sich bei den 2 ManyToMany Deklarationen
um ein und dieselbe Beziehung handelt !
(Ansonsten sind es fuer Hibernate 2 voneinander unabhaengige unidirectionale ToMany Beziehungen)

2. bei bidirectionalen ManyToMany Beziehungen MUESSEN beim Setzen einer Beziehung BEIDE Seiten gesetzt werden, also:

Code:
        tag.add(subject)     UND   subject.add(tag)


Zwar ergibt sich in der Summe nur ein einziger physischer INSERT, das ist aber voellig richtig so.
Denn durch die Normalierung soll Redundanz (=doppelte Speicherung ein und derselben Information) ja bekanntlich vermieden werden.
Der physischer INSERT erfolgt dabei genaugenommen bereits durch das Setzten einer einzigen Seite (ich glaube der inverse-seite), der Hibernate-User sollte sich aber dadurch nicht verleiten lassen, das Setzen der anderen Seite zu unterlassen. Dadurch bleibt die Relation naemlich inkonsistent. Erst wenn sie neu von der Datenbank gelesen wird,
bereinigt sich die Situation. Also: bitte immer schoen brav beide Seiten setzen.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 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.