-->
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.  [ 29 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: n zu m abbilden mit zusätzlichen Attributen
PostPosted: Fri Jan 16, 2009 8:27 am 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
Hi zusammen,

meine Tabellen sehen so aus:

Artikel
id
name
,,,

Lieferant
id
name
....

Artikel_Lieferant
id_artikel
id_lieferant
preis
zusatzinfo

Wie man eine einfache n zu m - Beziehung abbildet, dazu habe ich genügend Beispiele gefunden (z.B. hier http://www.hibernate.org/hib_docs/refer ... tions.html). Das macht man mit set und dann one-to-many und many-to-one. Aber ich hab halt noch zusätzliche Attribute (preis und zusatzinfo). Hat jemand vielleicht ein Beispiel parat oder weiß das zufällig. Ich bin schon seit einer Weile am googlen...

Bisher sieht meine Artikelmappingdatei so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
               "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
   <class name="uk.ac.napier.hois.model.Artikel" table="Artikel">
      <id name="id" column="id" type="java.lang.Integer">
         <generator class="increment" />
      </id>
      <property name="name" column="name" type="java.lang.String" />

            <!-- Was kommt hier? -->

</class>
</hibernate-mapping>

Meine Mappingdatei für Lieferanten sieht bisher so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
   <class name="uk.ac.napier.hois.model.Lieferant" table="Lieferant">
      <id name="id" column="id" type="java.lang.Integer">
         <generator class="increment" />
      </id>
      <property name="name" column="name" type="java.lang.String" />
   </class>
</hibernate-mapping>


Danke!

Gruß,
henryf[/code]


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:19 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Wie wäre es einfach mit einer "Zwischen"-Entity? Also sozusagen ein "LieferantenArtikel" oder sowas?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:21 am 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
mmerder wrote:
Wie wäre es einfach mit einer "Zwischen"-Entity? Also sozusagen ein "LieferantenArtikel" oder sowas?


hab ich doch, das ist doch meine Artikel_Lieferant. Darin verbinde ich Artikel und Lieferanten. Mir geht es nicht darum wie mache ich das Datenbankschema. Das ist schon fertig. Mich interessiert wie sieht für so ein Schema das Mapping aus.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:41 am 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Artikel - one-to-many - ArtikelLieferant - many-to-one - Lieferant?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 10:45 am 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Artikel - one-to-many - ArtikelLieferant - many-to-one - Lieferant?


Also lege ich für die Zwischenentität (Artikel_Lieferant) auch eine Klasse und Mappingdatei an oder wie?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 11:15 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Genau das meinen wir. ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 11:17 am 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
henryf wrote:
Also lege ich für die Zwischenentität (Artikel_Lieferant) auch eine Klasse und Mappingdatei an oder wie?


Ja, sonst kannst Du keine zusätzliche Properties verwenden

Ohne Properties auf ArtikelLieferant könntest Du sonst ein many-to-many auf beiden Seiten (Artikel + Lieferant) machen und dafür ARTIKEL_LIEFERANT als zwischentable angeben

PS: Rating ist willkommen :o)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 11:18 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Du kannst übrigens zwei Posts raten. :-D


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:11 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Artikel - one-to-many - ArtikelLieferant - many-to-one - Lieferant?


Schon mal vielen Dank für deine Hilfe. Könntest du noch konkret sagen wo die mappings reinkommen? Und wo ich ein set brauche? Also kommt one-to-many in Artikel.hbm.xml mit der Angabe von dem FK in ArtikelLiferant? und may-to-one dann in ArtikelLieferant.hbm.xml oder in Lieferant.hbm.xml? Thnx!


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:15 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Artikel und lieferant
one-to-many auf Artikellieferant
set oder bag
artikel_lieferant sollte dafür eine eigene ID haben
verbindung über artikel_id bzw. lieferant_id

artikellieferant
je eine many-to-one auf artikel und lieferant


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:20 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Artikel und lieferant
one-to-many auf Artikellieferant
set oder bag
artikel_lieferant sollte dafür eine eigene ID haben
verbindung über artikel_id bzw. lieferant_id

artikellieferant
je eine many-to-one auf artikel und lieferant


Macht irgendwie Sinn :-) Ich habe bei Artikel_Lieferant aber keine ID. Mein Primärschlüssel ist zusammengesetzt aus den beiden IDs von Artikel und Lieferant. Muss ich dafür wirklich eine ID haben?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 1:57 pm 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Falls du keine eigene ID anlegen willst, kannst du auch eine zusammengesetzte ID aus den beiden Fremdschlüsseln anlegen.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 2:00 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Es geht glaub ich auch ohne, aber es ist sonst glaub ich einfacher wenn du eine separate ID hast....


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 2:04 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Es geht glaub ich auch ohne, aber es ist sonst glaub ich einfacher wenn du eine separate ID hast....

Ja hab mal in der Doku von dem Link gelesen dass der Ansatz mit Composite-id in Hibernate nicht zu empfehlen ist. Man müsste eine ID-Klasse oder so einführen um das sauber zu impl. Werde daher der einfachheithalber eine ID einführen.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 16, 2009 2:38 pm 
Beginner
Beginner

Joined: Fri Jan 16, 2009 8:06 am
Posts: 24
pkleindl wrote:
Artikel und lieferant
one-to-many auf Artikellieferant
set oder bag
artikel_lieferant sollte dafür eine eigene ID haben
verbindung über artikel_id bzw. lieferant_id

artikellieferant
je eine many-to-one auf artikel und lieferant


Also ich hab jetzt für artikellieferant einen eigenen PK noch dazugemacht.
Meine Mappings sehen jetzt so aus:
Artikel.hbm.xml:
Code:
      
....
<set name="artikelLieferant" cascade="all">
  <key column="id_artikel" />
  <one-to-many class="ArtikelLieferant"/>
</set>
...


Lieferant.hbm.xml:
Code:
      
....
<set name="artikelLieferant">
  <key column="id_lieferant" />
  <one-to-many class="ArtikelLieferant" />
</set>...


ArtikelLieferant.hbm.xml:
Code:
...
      <id name="id" column="id" type="java.lang.Integer">
         <generator class="increment" />
      </id>
---
      <many-to-one name="artikel" class="Artikel" />
      <many-to-one name="lieferant" class="Lieferant" />
...


Die Klassen:
Artikel.java:
Code:
...
   private Set artikelLieferant;
        // getter + setter natürlich
...


Lieferant.java:
Code:
...
   private Set artikelLieferant;
        // getter + setter natürlich
..


ArtikelLieferant.java:
Code:
...
   private Artikel artikel;
   private Lieferant lieferant;
        // getter + setter natürlich
...


Ich habe mal nur die Codezeilen die entscheidend sind aufgeführt. Also ist das so ok wie ist das gemacht habe oder vertue ich mich da irgendwo?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 29 posts ]  Go to page 1, 2  Next

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.