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

Status
Nicht offen für weitere Antworten.

ch3fk0ch

Mitglied
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:
Code:
@OneToMany(mappedBy="fk_1", fetch=EAGER)
public Collection<TabelleBData> getTabelleB(){
    return tabelleB;
}
--Setter--

TabelleBData:
Code:
@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
 
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
 
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
 
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.
 
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 🙂
 
Mach es doch über zwei Attribute:

Tabellen

Tabelle1(id, name) PK: id

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

Klassen

Code:
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
 
ch3fk0ch hat gesagt.:
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?).
[..]
(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 🙂

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
 
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
 
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 🙂
 
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
 
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 🙂
 
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 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben