Hallo,
ich habe ein Problem mit dem Lesen von Daten aus einer simplen many-to-many Beziehung.
Diese Beziehung liegt zwischen den Entitäten Benutzer und Kunde. Die Zwischentabelle heißt kunde_benutzer.
(Anmerkung: Dass ein Benutzer mehreren Kunden zugeordnet ist, ist beabsichtigt)
Wenn ich nun Benutzer mit Login "Anton", der zwei Kunden zugeordnet ist (Kunden mit ID 13 und 14), mit Hibernate lade,
bekomme ich zwei Benutzer-Objekte zurück, die jeweils den Login "Anton" haben und jeweils den Kunden mit ID 14!
Ich möchte aber *ein* Benutzer-Objekt haben, dessen Set gefüllt ist mit beiden Kunden.
Kann mir jemand einen Tipp geben, wie ich das richtig mache?
Folgend:
Tabelleninhalte, Hibernate-Mappings, Java-Code, SQL
Hibernate version:
3.1.3
Code:
Kunde:
ID KUNDEN_NR NAME
---------- ---------- -------
14 00009991 Kunde2
13 00009990 Kunde1
Benutzer:
ID LOGIN
---------- --------
44 Anton
kunde_benutzer:
BENUTZER_ID KUNDE_ID
----------- ----------
44 14
44 13
Mapping documents:Code:
Mapping für Benutzer:
<class name="Benutzer"
table="Benutzer">
...
<set
name="kunden"
table="kunde_benutzer"
lazy="true"
inverse="true"
cascade="none"
sort="natural"
>
<key column="benutzer_id"></key>
<many-to-many
class="Kunde"
column="kunde_id"
outer-join="auto"
/>
</set>
...
Mapping für Kunde:
<class name="Kunde"
table="Kunde">
<set
name="benutzer"
table="kunde_benutzer"
lazy="true"
cascade="save-update"
sort="natural"
>
<key column="kunde_id"></key>
<many-to-many
class="Benutzer"
column="benutzer_id"
outer-join="auto"
/>
</set>
Der relevante Java-Code:Code:
//Zugriff auf Benutzer:
public Benutzer findBenutzerByLogin(String login) {
String queryString = "FROM Benutzer ben JOIN FETCH ben.kunden WHERE ben.login = :login";
List<Benutzer> benutzer = (List<Benutzer>)
HibernateUtil.getCurrentSession().createQuery(queryString).setString("login", login).list();
System.out.println("Anz. Benutzer: " + benutzer.size()); //ergibt 2
System.out.println("Anz. Kunden Ben(0): " + benutzer.get(0).getKunden().size()); //ergibt 1
System.out.println(benutzer.get(0));
return benutzer.get(0);
}
public class Benutzer implements Comparable{
...
public SortedSet<Kunde> getKunden() {
return this.kunden;
}
}
public class Benutzer implements Comparable{
...
public SortedSet<Benutzer> getBenutzer() {
return this.benutzer;
}
}
The generated SQL (show_sql=true):Code:
select benutzer0_.id as id1155_0_, kunde2_.id as id1153_1_, benutzer0_.login as login1155_0_, benutzer0_.nachname as nachname1155_0_, benutzer0_.vorname as vorname1155_0_, benutzer0_.passwort as passwort1155_0_, benutzer0_.anlage as anlage1155_0_, kunde2_.anlage as anlage1153_1_, kunde2_.kunden_nr as kunden3_1153_1_, kunde2_.name as name1153_1_, kunden1_.benutzer_id as benutzer2_0__, kunden1_.kunde_id as kunde1_0__ from Benutzer benutzer0_, kunde_benutzer kunden1_, Kunde kunde2_ where benutzer0_.id=kunden1_.benutzer_id and kunden1_.kunde_id=kunde2_.id and benutzer0_.login=?