Hallo,
ich hab ein ganz ähnliches Problem wie henryf gerade, aber leider ein legacy DB-Modell, an dem ich nichts ändern kann (d.h. ich kann leider keine ID in die Link-Tabelle einfügen!). Ich verwende seine Namen, angepasst an mein DB-Schema:
Artikel
mainid
subid
name
Lieferant
id
name
Artikel_Lieferant
mainid_artikel
subid_artikel
menge_lieferant
id_lieferant
zusatzinfo
Der Unterschied: Die Beziehung zwischen Artikel und Lieferant ist bei meinem DB-Modell nicht "direkt", sondern über den Umweg einer "Menge", d.h. zu jedem Artikel
und je einer Menge (0 / 1 / 2 - oder "klein" / "mittel" / "groß") gibt es (höchstens) einen Lieferanten:
Artikel A - Menge klein - Lieferant X
Artikel A - Menge groß - Lieferant Y
Artikel B - Menge groß - Lieferant X
Und ich brauch erstens das Set der Lieferanten zu einem Artikel - was prima klappt -, und zweitens das Set der Mengen zu einem Artikel. Für letzteres krieg ich kein Mapping hin. Oder formaler: Ich weiß nicht, wie ich ein Link-Entity
gleichzeitig als Link-Entity und als Werte-Tabelle verwenden kann.
Zuerst mal die Mappings der Entities, wie ich sie habe und wie sie funktionieren:
Artikel.hbm.xml
Code:
...
<class name="Artikel" table="ARTIKEL">
<composite-id name="id" class="ArtikelPK">
<key-property name="mainID" column="MAINID" type="string" />
<key-property name="subID" column="SUBID" type="date" />
</composite-id>
...
<!-- die N-M-Beziehung Artikel - Lieferant -->
<set name="lieferanten" table="ARTIKEL_LIEFERANT">
<key>
<column name="MAINID_ARTIKEL" />
<column name="SUBID_ARTIKEL" />
</key>
<many-to-many class="Lieferant">
<!-- Achtung: Das ist KEINE Schlüsselkomponente in
ARTIKEL_LIEFERANT, klappt aber ... -->
<column name="ID_LIEFERANT" />
</many-to-many>
</set>
</class>
Lieferant.hbm.xmlCode:
...
<class name="Lieferant" table="LIEFERANT">
<id name="id" column="ID" type="integer" />
<property name="name" column="NAME" type="string" />
...
</class>
ArtikelLieferant.hbm.xmlCode:
...
<class name="ArtikelLieferant" table="ARTIKEL_LIEFERANT">
<composite-id name="id" class="ArtikelMengePK">
<key-property name="mainID_Artikel" column="MAINID_ARTIKEL" type="string" />
<key-property name="subID_Artikel" column="SUBID_ARTIKEL" type="date" />
<key-property name="menge_Lieferant" column="MENGE_LIEFERANT" type="integer" />
</composite-id>
...
<many-to-one name="Artikel" class="Artikel">
<column name="MAINID_ARTIKEL"/>
<column name="SUBID_ARTIKEL"/>
</many-to-one>
<many-to-one name="Lieferant" class="Lieferant">
<column name="ID_LIEFERANT"/>
</many-to-one>
</class>
Die N-M-Beziehung zwischen Artikel und Lieferant funktioniert wie gesagt prima, d.h. ich krieg zu jedem Artikel alle seine Lieferanten. Aber ich krieg kein Mapping hin, das mir zu jedem Artikel das Set seiner Mengen liefert, sprich das Set der MENGE_LIEFERANT zu dem
Teil-Schlüssel in ARTIKEL_LIEFERANT, der FK aus ARTIKEL ist. Ich habe - neben vielem anderen - folgendes versucht:
Artikel.hbm.xmlCode:
...
<class name="Artikel" table="ARTIKEL">
...
<!-- die N-M-Beziehung Artikel - Artikel-Lieferant -->
<set name="mengen" table="ARTIKEL_LIEFERANT">
<key>
<column name="MAINID_ARTIKEL" />
<column name="SUBID_ARTIKEL" />
</key>
<many-to-many class="ArtikelLieferant">
<column name="MENGE_LIEFERANT" />
</many-to-many>
</set>
</class>
Aber da krieg ich eine MappingException (verkürzt):
Code:
Exception in thread "main" org.hibernate.MappingException: Foreign key (FK80FC9E13DFD06AAF:ARTIKEL_LIEFERANT [MENGE_LIEFERANT])) must have same number of columns as the referenced primary key (ARTIKEL_LIEFERANT [MAINID_ARTIKEL,SUBID_ARTIKEL,ID_LIEFERANT])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:90)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:73)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1269)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1176)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at <<myBaseRootDAO.initialize()>>
Auch bei allen meinen sonstigen Versuchen krieg ich solche Hibernate-Exceptions. Es scheint mir immer daran zu scheitern, dass meine Link-Table einen composite key hat, ich aber nur einen Teil-Schlüssel (den Artikel-Schlüssel) habe und mit dem die Menge der restlichen Schlüsselkomponenten bestimmen will. Sollte das tatsächlich nicht gehen??
Danke euch vielmals!
Harald