# Hibernate-Mapping bei mehreren  FK´s auf die selbe Tabelle



## ch3fk0ch (13. Mrz 2006)

Hallo Gemeinde!

Erst mal muss ich loswerden, dass dieses Forum  hier ein richtig lesenswertes is. Besten Dank erstmal.

Nun zu meiner Problemstellung:
Ich glaube ein Denk-/Mapping-Problem zu haben. Vielleicht habt Ihr ja ne Idee.
Es handelt sich um 2 Tabellen. In einer (Tabelle A) existieren keine FK´s. In der anderen (Tabelle B) existieren mehrere FK´s auf Tabelle A. Also bspw. fk_1, fk_2 etc. Alle referenzieren einen Datensatz aus Tabelle A. Also liegt eine 1:n - Beziehung vor (erster Fehler?).
Somit ergibt sich in den xyzData-Klassen folgendes Mapping:

TabelleAData:

```
@OneToMany(mappedBy="fk_1", fetch=EAGER)
public Collection<TabelleBData> getTabelleB(){
    return tabelleB;
}
--Setter--
```

TabelleBData:

```
@MabyToOne(fetch=EAGER)
@JoinColumn(name="fk_1")
public TabelleAData getFk_1(){
    return fk_1;
}
-- Setter --
```
(hier beispielhaft nur einer von mehreren FK´s).

Die Frage wäre nun, brauche ich in Tabelle A mehrere Objekte vom Ty Tabelle B, um alle FK´s zu berücksichtigen? Oder reicht meine eine Collection aus? 
Ist es möglich in das mappedBy-Statement mehrere FK-Spalten zu referenzieren? Oder ist das alles grundsätzlich falsch? ^^


Ich hoffe, Ihr könnt erkennen, was ich meine, wenn net, bitte sagen, ich umschreibe gern mehr 

Besten Dank für Eure Aufmerksamkeit.

Grüße


----------



## KSG9|sebastian (13. Mrz 2006)

in der .hbm.xml-Datei kannst du doch mehrere many-to-ones bzw. set/bags definieren welche an ein Attribut der Klasse bzw. an eine Tabellenspalte gebunden sind.

Wie das mit ner Collection (sinnvoll) lösbar wäre wüsste ich nicht.

//edit: Machst du alles über annotations ? Grausam ;D.. mapping-Dateien find ich besser


----------



## ch3fk0ch (13. Mrz 2006)

Hi!

Erstmal besten Dank für die schnelle Antwort. Ich werd mir wohl dann nochmals die Hibernate-Doku  zu Gemüte führen. Denn wenn das in ner externeen Datei möglich is, sollte das über die Annotations wohl auch gehen. (Ja, mags gern am Platz ^^).

Aber rein von der Überlegung her, also der beziehung, des Tabellenaufbaus, is OK, meinst? Musst verstehn, ich bin kein DB-Jünger, aba ohne das bringt mir mein lieber Anwendungskern eben wenig :/

Grüße


----------



## KSG9|sebastian (13. Mrz 2006)

Ich hatte mal das gleiche Problem, dass ich drei FKs auf dieselbe Tabell hatte..aber da hab ich kein Hibernate verwendet. 
Aber es geht definitiv mit Hibernate..aber wie es mit Hibernate Annotations geht weiß ich net, ich arbeite gerner mit ner externen Mapping-Datei.


----------



## ch3fk0ch (13. Mrz 2006)

*hibernate-annotations.pdf lesen tu


----------



## ch3fk0ch (13. Mrz 2006)

Hi nochmals!

Habs gefunden:

@ManyToOne
@JoinColums({@JoinColumn(name="fk_1"), @JoinColumn(name="fk_2")})
public Collection<TabelleBData> getTabelleBDaten(){
   return TabelleBDaten;
}
...

Nur erhalte ich jetzt nen Hibernate-Fehler, der mir da sagen will, dass Collections noch nicht supportet sind... hilfe -.-
Auf den ersten Sieg folgt der Rückschlag 

Ne Idee jmd? 

Grüße und besten Dank


----------



## KSG9|sebastian (13. Mrz 2006)

Mach es doch über zwei Attribute:

Tabellen

Tabelle1(id, name) PK: id

Tabelle2(id, fk1, fk2) PK: id, FK: fk1, fk2

Klassen


```
public class Tabelle1{
  Integer id;
  String name;

  // konstruktor

  // getter u. setter
}

public class Tabelle2{
   ..
   Tabelle1 tab1;
   Tabelle2 tab2;
   
    // konsturktor

    // getter u. setter
}
```

Und dann eben tab1 auf tab2.id mappen und tab2 ebenfalls auf tab2.id mappen


----------



## abollm (13. Mrz 2006)

ch3fk0ch hat gesagt.:
			
		

> Hallo Gemeinde!
> 
> Erst mal muss ich loswerden, dass dieses Forum  hier ein richtig lesenswertes is. Besten Dank erstmal.
> 
> ...



Ohne jetzt auf deine Hibernate-Mapping-Beispiele einzugehen, ist mir aufgefallen, dass du offenkundig den Fehler bereits bei der Datenbankstruktur begehst:

Wenn du bei zwei Tabellen A und B in einer dieser beiden Tabellen mehr als einen FK auf z.B. die Tabelle A hast, ist deine Struktur nicht vollständig normalisiert und du erhältst demgemäß Redundanzen oder Anomalien, siehe auch:

Normalisierung


----------



## ch3fk0ch (14. Mrz 2006)

Guten Morgen! 
Ja, das meinte ich. Nur is die Frage, wie man das Problem sonst angehen könnte.
Zum Verständnis:
Es handelt sich bei der ersten Tabelle um eine, in der Getränke stehen. In der zweiten steht dann der Cocktail. Dieser besteht aus mehreren Getränken aus TabelleA und deren Mengenangaben. Rest is Schminke.

Ich denk mir auch schon die ganze Zeit, dass hier was net richtig läuft... komm nur net auf ne Ausweichmöglichkeit.

Grüße


----------



## KSG9|sebastian (14. Mrz 2006)

Das ist eine m:n-Beziehung  Mach 3 Tabellen:

Cocktail(cocktailId, name)
Getraenk(getraenkId, name)
Zutaten(cocktailId, getraenkId)

Müsste so stimmen..bin noch n bissl müde


----------



## ch3fk0ch (14. Mrz 2006)

Hi!
Meine Augen sind auch noch etwas klein, deshalb sei es Dir verziehen, hehe.

Ich werd das ma nach Deinen Aspekten umbaun und Bescheid geben. 

BESTEN DANK für die nette Hilfe 


Grüße


----------



## ch3fk0ch (15. Mrz 2006)

Hi Ihr!

Habs ma in ne n:m umgebaut und hätte aber nu noch ne Frage:
Bei ner n:m Beziehung muss ich ja keine Data-Klasse schreiben,  da ich diese Tablle ja per @JoinTable(...) einbaue. 
Wenn ich aber keine Data-Klasse für meine Join-Tabelle habe, kann ich sie auch nicht mappen, richtig?
Wenn ich sie net mappen kann, kann ich aber auch keine namedQueries basteln.
Wie habe ich nun Zugriff auf diese Tabelle?

Sry, is meine erste n:m in Java *duck*


Grüße und besten Dank


----------



## ch3fk0ch (15. Mrz 2006)

ok, war wohl nochn bissel früh ^^

Kann mir ja die Sachen per Getter holen -.- Verzeiht meine allmorgentliche geistige Abwesenheit.

Nur habich n neues Problem, an dem ich seid ner Weile nun hänge:

Wenn ich meine Query in der DAO abgesetzt habe, macht er mir die Session gleich zu. Soller aber net, da ich sonst nicht auf die Objekte aus meiner JoinTabelle zugreifen kann. Jetz habich mal gegoogelt, aber nicht wirklich ne gute Lösung gefunden >.<
Bekomme noch immer "failed to lazily initialize a collection of role: ..."
Ich denke mir mal, dass nach dem query.uniqueResult(); Statement die Session geschlossen wird. 
Gibts ne Mgl. diese aufrecth zu erhalten?

Grüße und besten Dank 

EDIT: Habs gefunden; musste einfach über beide Collections einmal mit ner for-Schleife drüberlaufen. Sweeeeet 
Trotzdem danke


----------

