-->
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: Mapping auf einen Teil des Primärschlüssels
PostPosted: Tue May 11, 2010 3:34 am 
Beginner
Beginner

Joined: Sun Apr 25, 2010 7:14 am
Posts: 30
Hi,

sorry wegen dem Titel aber ich wusste einfach nicht, wie ich das treffender in einem Satz zusammenfassen könnte.

Ich habe ein Problem mit einer Tabellenstruktur bei der ich nicht weiß, wie/ob ich es in Hibernate abbilden kann. Folgende Struktur (stark vereinfacht):

Tab1:
pktab1 (PK)
fktab2 (FK auf number in Tab2)

Tab2:
number (PK)
lang (PK)
content (String)

Die Tab1 hat also nur einen Teil des PKs von Tab2 als FK. Der 2. Teil des PK (Sprache) wird durch den Code zur Laufzeit ermittelt.
Konkret wählt der Benutzer diese aus.

Beispieldaten:
Tab1:
1 1

Tab2:
1 1 Hallo
1 2 Hello
usw.

Habe bereits einige Zeit gesucht aber ich konnte in den Dokus nichts finden, wie es möglich wäre so etwas abzubilden. Auch ein
Custom UserType scheint nicht die Möglichkeiten des Eingriffs zu bieten, die ich hier brauchen würde.

Kann mir vielleicht jemand von euch helfen bzw. einen Tipp geben wie es mit Hibernate lösbar wäre (bzw. einen äquivalenten
Alternativvorschlag)?

Vielen Dank :)

Grüße
Thomas


Top
 Profile  
 
 Post subject: Re: Mapping auf einen Teil des Primärschlüssels
PostPosted: Tue May 11, 2010 4:52 am 
Newbie

Joined: Wed Apr 21, 2010 8:41 am
Posts: 12
Hallo,

vielleicht sollten wir uns zuvor noch gedanken über dein Datenbank-Schema machen. Für mich sieht das fast wie eine klassische 1:n-Beziehung aus. So würde ich es machen (ohne EmbeddedIds):

Tabelle1 Tabelle2
ID|...|... ID|IDTAB1|...

Tabelle2 hat einen FK (Tabelle2.IDTAB1) zu Tabelle1.ID

Jetzt kannst du z.B. mit "select * FROM Tabelle2 where IDTAB1=?" alle Datensätze aus Tabelle2 für ein Element aus Tabelle1 auslesen.

Vielleicht kannst du dein Beispiel auch mit EmbeddedIds umsetzen, aber grundsätzlich würde ich mir nie nur einen Teil des Primärschlüssels merken!

Grüße,
Jonas


Top
 Profile  
 
 Post subject: Re: Mapping auf einen Teil des Primärschlüssels
PostPosted: Tue May 11, 2010 5:09 am 
Beginner
Beginner

Joined: Sun Apr 25, 2010 7:14 am
Posts: 30
Hi,

erstmal danke für deine Antwort :)

Ganz so einfach ist es leider nicht. Auch ich habe bereits daran gedacht, die Beziehung umzudrehen (Tab2 => Tab1). Um zu erklären warum das
(meiner Meinung nach) leider auch suboptimal ist muss ich etwas weiter ausholen:

Diese vereinfachte Struktur stellt die Umsetzung eines Mehrsprachigkeitskonzeptes dar. Dieses Konzept greift auf Spaltenebene. Eine sprachabhängige
Spalte (z.B. Titel, Vorspann, Text usw.) enthält dann nicht mehr den Text an sich sondern nur eine ID auf die Sprachtabelle (Tab2)... allerdings eben
nicht den kompletten Schlüssel, sondern nur einen Teil. Der 2. Teil ergibt sich aus der ausgewählten (vom Benutzer) Sprache. Jede Inhaltstabelle kann
also beliebig viele Referenzen auf die Sprachtabelle haben. Somit müsste ich die Sprachtabelle zusätzlich um ein Kriterium erweitern, das angibt welches
Feld es darstellt. Das würde ich eher ungern machen. Grund für diese Art der Lösung ist, dass jeder Datensatz (egal in welcher Sprache) die gleiche
ID hat. Das ist extrem hilfreich bei komplexen Beziehungen zu anderen Objekten.

Außerdem ergeben sich dadurch sehr viele Queries. Wenn ich einen Inhalt auslesen will müssen zusätzlich alle 1:n Beziehungen gefüllt werden (eventuell
mit Daten aus zig Sprachen obwohl ich nur eine brauche).

Grüße
Thomas


Top
 Profile  
 
 Post subject: Re: Mapping auf einen Teil des Primärschlüssels
PostPosted: Tue May 11, 2010 12:06 pm 
Newbie

Joined: Fri Feb 05, 2010 8:34 am
Posts: 15
Sehr geehrter Herr Werzi,

Soweit ich das richtig verstanden habe ist das was Sie da machen wollen nicht umbedingt einfach.
Mein Ansatz wäre es damit zu versuchen, die eine Tabelle auf zwei Klassen zu mappen.
Das hilft deinem Problem wahrscheinlich jetzt nicht direkt weiter, aber es könnte vielleicht ein Lösungsansatz sein.
Ich würde versuchen ob es was bringt die eine Klasse auf Tab2 zu mappen , und dabei den PK so zu mappen wie er auch in der DB ist , und eine zweite Klasse auf die gleiche Tabelle zu mappen, dabei aber nur die erste Spalte als PK zu mappen , die zweite als Property.
Aber ich glaube das hilft dir nicht wirklich weiter.

Möglichkeit Nummer zwei ist, die DAtensätze aus Tab2 einfach per Query rauszuholen und auf das Mapping zu verzichten.
Schreiben kannst du den Datensatz ja , und rauslesen geht dann über eine Query.

Möglichkeit Nummer drei: Du holst einfach den Datensatz aus Tabelle 2 in allen Sprachen raus die du haben willst und suchst dir den entsprechenden Datensatz im Code raus (.Net kennt dafür Linq ;-) )
Nicht ganz elegant, aber das bischen was da an Daten mehr übertragen wird, sollte sich bei einer Hand voll Sprachen in Grenzen halten.

Bei Fragen kannst du dich auch an einen K.J. aus S. wenden ;-)


Top
 Profile  
 
 Post subject: Re: Mapping auf einen Teil des Primärschlüssels
PostPosted: Sun May 16, 2010 6:45 am 
Newbie

Joined: Fri Feb 05, 2010 8:34 am
Posts: 15
Noch ein Ansatz:
Man sollte eigentlich das Mapping XML zur Laufzeit verändern können müssen.
Da könnte man, nachdem der User sich angemeldet hat, das Mapping XML so abändern, dass es passt....


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:
cron
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.