-->
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.  [ 6 posts ] 
Author Message
 Post subject: many-to-many: Zugriff auf Collection Elemente
PostPosted: Wed Jun 13, 2007 9:30 am 
Newbie

Joined: Wed Jun 13, 2007 8:36 am
Posts: 3
Hallo,
habe ein grundlegendes Problem, was ich bisher nicht über die Literatur und Foren lösen konnte. Es müsste aber ein geläufiges Problem sein.

Ich habe eine m:n Beziehung zwischen 2 Tabellen. Mein Problem ist dass diese Beziehung in hibernate durch Collections dargestellt wird, was ich am besten an folgendem vereinfachten Bsp zeigen kann:
m:n Beziehung zwischen Person und Gruppe. personA ist in gruppeA und gruppeB.
Query in hibernate "from person join person.gruppen g" erzeugt folgendes resultset:
Code:
Person   |  Gruppe
-----------------------
personA  |  [gruppeA, gruppeB]
personA  |  [gruppeA, gruppeB]

gewünscht wäre aber ein resultset wie folgt, was auch ein normaler join in sql erzeugt:
Code:
Person   |  Gruppe
-----------------------
personA  |  gruppeA
personA  |  gruppeB

Frage? Wie lässt sich solch ein Resultset erreichen? Wie lässt sich gezielt auf die Elemente der Collection zugreifen? Ich weiß nicht wo ich ansetzen soll. Ein Versuch über die Collection zu iterieren und die gruppen einzelnd auszugeben führt nicht zum Ziel, da ein Filtern oder Sortieren nach Gruppen dann nicht mehr korrekt möglich ist.

Details:

* Hibernate 3.2.3

Mapping Beispiel für Person, äquivalent auch für Gruppe:
Code:
<set name="gruppen" inverse="true" table="person_gruppe">
   <key>
      <column name="person" not-null="true" />
   </key>
   <many-to-many entity-name="Gruppe">
       <column name="gruppe" not-null="true" />
    </many-to-many>
</set>


Danke, gruß Raphael


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 13, 2007 9:40 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Mach es Dir doch einfacher. Du hast doch die Beziehung gemappt, warum willst Du noch eine HQL-Abfrage starten?
Wenn Du alle Personen einer Gruppe haben möchtest, brauchst Du laut Deinem Mapping ja nur eine Gruppe aus der DB lesen. Automatisch werden in die Collection personen (schätze mal, dass die so heisst) auch die entsprechenden Personen geladen. Fertig.

Gehst Du über Person, so hast Du ja das Äquivalent zu Gruppe, sprich eine Collection von Gruppen, die zu der Person gehören.
Willst Du jetzt eine Liste von bereits geladenen Personen nach einer Gruppe filtern brauchst du die Collection doch nur nach Person.getGruppen().contains(gruppeA) zu fragen und schon weisst Du ob sie zu der Gruppe gehört oder nicht.

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 13, 2007 10:37 am 
Newbie

Joined: Wed Jun 13, 2007 8:36 am
Posts: 3
hallo,
das bringt mich leider nicht weiter. das ganze war sehr vereinfacht dargestellt, mein datenbankmodell hat aber einige tabellen mehr. d.h. an der person hängen neben gruppen auch noch räume, kommunikationseinheiten und einiges mehr.
zur auflistung der personen mit allen daten muss ich also ein query mit einigen joins machen. auf der db in reinem sql ist das kein problem, aber in hibernate weiss ich wie gesagt nicht wie ich mit den collections umgehen soll.
es soll z.b. für jeden raum, jedes telefon, jede gruppe einer person eine zeile ausgegeben werden. und die tabelle sollte dann auch über alle spalten sortierbar sein.

danke, gruß Raphael


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 13, 2007 11:20 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Was Du willst ist als eigentlich ein Kreuzprodukt?

Nur kurze Frage nebenbei (nicht böse gemeint): Kommst Du aus dem OO-Umfeld?
Also wenn Du dieses Problem nicht auf Programmebene lösen möchtest, dann hast du mit Hibernate eigentlich nur eine Chance:
1.) Anlegen einer View die Deinen Anforderungen entspricht (Aktualisierungskonzept beachten!)
2.) Mappen dieser View in ein entsprechendes Java-Objekt
-Fertig-

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 3:32 am 
Newbie

Joined: Wed Jun 13, 2007 8:36 am
Posts: 3
FPC wrote:
Was Du willst ist als eigentlich ein Kreuzprodukt?

natürlich kein komplettes kreuzprodukt der gejointen tabellen, da einschränlungen im where, aber im grunde ja.
FPC wrote:
Nur kurze Frage nebenbei (nicht böse gemeint): Kommst Du aus dem OO-Umfeld?

habe wohl soviel OO Erfahrung wie Relationale-DB Erfahrung
FPC wrote:
Also wenn Du dieses Problem nicht auf Programmebene lösen möchtest, dann hast du mit Hibernate eigentlich nur eine Chance:
1.) Anlegen einer View die Deinen Anforderungen entspricht (Aktualisierungskonzept beachten!)
2.) Mappen dieser View in ein entsprechendes Java-Objekt

dass ich es nicht auf programmebene lösen möchte ist nicht gesagt, nur das es dann meiner meinung nach sehr kompliziert wird, das sortieren und filtern der daten zu bewerkstelligen. allerdings die sache über einen view zu regeln ist ebenfalls auswendig.
wie gesagt, da die ausgabe des "kreuzproduktes" in der DB einfach ist, bin ich doch sehr überrascht, dass das in hibernate dann nicht direkt lösbar ist. die aufgabenstellung ist doch auch nciht unbedingt ungewöhnlich oder? sowas müsste doch sehr oft gebraucht werden?!
ich werde mein glück dann nochmal auf programmebene versuchen, mit ein paar while schleifen und temporären variablen...(klingt nicht wirkich professionell ;)

danke, gruß Raphael


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 14, 2007 3:51 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Nun Du musst bedenken, Hibernate arbeitet objektorientiert und wird immer versuchen die Daten aus Abfragen möglichst immer in den entsprechenden Objekten zusammen zufassen.
Also als beste Lösung würde ich in Deinem Fall immer noch die View sehen, je nachdem wieviele Datensätze vorhanden sind, kann man sie ja auch so einstellen, dass sie direkt auf die entsprechenden Tabellen verweist und somit stets aktuell ist.
Auf diese Art und Weise hast Du dann in deinem Projekt ein Objekt, welches genau Deinen Ansprüchen gerecht wird und auch leicht sortiert und gefiltert werden kann.

Zu Deiner Aufgabenstellung würde ich sagen, dass man die auch zur Not mit einer zweifachen for-Schleife regeln kann, wobei ich aber die View eleganter finde, vorallem wenn sich mal etwas ändern sollte. Dann musst Du nicht im Programmcode rumwühlen und hoffen, dass Du alle Stellen gefunden hast (eigene Erfahrung).

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


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