-->
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.  [ 5 posts ] 
Author Message
 Post subject: ähnlich "n zu m abbilden mit zusätzlichen Attributen&
PostPosted: Mon Jan 19, 2009 9:02 am 
Newbie

Joined: Mon Jan 19, 2009 7:33 am
Posts: 2
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.xml
Code:
...
  <class name="Lieferant" table="LIEFERANT">
    <id name="id" column="ID" type="integer" />
    <property name="name" column="NAME" type="string" />
    ...
  </class>


ArtikelLieferant.hbm.xml
Code:
...
  <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.xml
Code:
  ...
  <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


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 19, 2009 9:38 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Hi,
ich finde dein Mapping nicht ganz passend zu deiner Beschreibung.
1. Wo ist die Spalte zusatzinfo in ArtikelLieferant?
2. Da du ja eine "Zwischenklasse" hast, sollte es keine n:m Beziehung mehr geben. Eine Zwischenklasse hat ja den Sinn, diese unnötig zu machen. Trotzdem hast du eine ManyToMany-Beziehung.

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 19, 2009 10:21 am 
Newbie

Joined: Mon Jan 19, 2009 7:33 am
Posts: 2
mmerder wrote:
Hi,
ich finde dein Mapping nicht ganz passend zu deiner Beschreibung.
1. Wo ist die Spalte zusatzinfo in ArtikelLieferant?


Oh, sorry, die hab ich im Mapping ausgelassen. Ignoriere die bitte, die hab ich nur von henryf übernommen, ohne groß nachzudenken ...

mmerder wrote:
2. Da du ja eine "Zwischenklasse" hast, sollte es keine n:m Beziehung mehr geben. Eine Zwischenklasse hat ja den Sinn, diese unnötig zu machen. Trotzdem hast du eine ManyToMany-Beziehung.


Öm, vielleicht versteh ich dich (oder Hibernate?) nicht richtig. Mit "Zwischenklasse" meinst du ArtikelLieferant? Vielleicht ist das der Kern des Problems:
* Ich hab eine Link-Tabelle, die Hibernate bei einer n:m-Beziehung transparent hält, d.h. dafür bräuchte ich keine Java-Klasse. Okay, soweit.
* Andererseits enthält die Link-Tabelle eigene Daten (ich weiß, das ist nicht sehr geschickt designed, aber wie gesagt: legacy-Datenmodell ...). Und um an die ranzukommen, gibt es diese "Zwischenklasse".

Kann sein, dass die in meinem Posting zitierten Mappings (die ich vorgefunden habe und die funktionieren) nicht sehr sinnig oder gar falsch sind, aber da sie funktionieren, hab ich versucht, meine Erweiterung (also den Zugriff auf Daten im Link-Entity) in diesen bestehenden Kram einzufügen. Wenn ich das besser anders machen sollte - könnte ich probieren (allerdings: never touch a running system ...).

Danke dir!
Harald


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 20, 2009 5:36 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Quote:
Andererseits enthält die Link-Tabelle eigene Daten (ich weiß, das ist nicht sehr geschickt designed, aber wie gesagt: legacy-Datenmodell ...). Und um an die ranzukommen, gibt es diese "Zwischenklasse".

Genau. Und da du ja nun keine von Hibernate verwaltete Linktabelle mehr hast, haben deine Entitäten ja nur noch 1:n Beziehungen zueinander.

Ein Artikel hat mehrere Artikel_Lieferanten, umgekehrt gehört jedes Artikel_Lieferant-Objekt zu genau einem Artikel. Daher 1:n statt n:m.


(Dein Modell ist meiner Meinung nach übrigens nicht ungeschickt, falls man n:m Beziehungen mit Zusatzinfos hat, ist das eine ganz normale Lösung.)

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 11, 2009 12:14 pm 
Newbie

Joined: Wed Mar 11, 2009 12:06 pm
Posts: 1
Location: Germany
Hallo zusammen,

ich beschäftige mich auch erst seit kurzem mit Hibernate und stehe vor dem selben Problem, wie hier beschrieben.

Ich bekomme ebenfalls die Fehlermeldung:
"Foreign key must have same number of columns as the referenced primary key"

Ich hab schon verschiedene Mappings (Lösungsansätze) ausprobiert, aber nichts funktionierte.

Leider hab ich die Lösung für dieses Problem hier im Thread vermisst. Könntet ihr sie mir zur Verfügung stellen?


Viele Grüße
Und Danke
Vroni


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