OneToMany Composite Key Mapping

OnDemand

Top Contributor
Hallo zusammen,

ich habe folgendes Beispiel, bekomme aber ein Problem beim Speichern, Select:

Code:
public class Product{
@ManyToOne
@JoinColumn(name = "products_shippingtime")
@LazyCollection(LazyCollectionOption.FALSE)
private ShippingStatus shippingStatus;
}

Code:
public class ShippingStatus{
@Id
@Column(name = "shipping_status_id")
private int shippingStatusId;

@ManyToOne
@JoinColumn(name = "language_id")
private GLanguage language;

}

ShippingStatus setzt sich aber aus 2 ID zusammen und zwar aus der shipping_status_id und der language_id. Mein Mapping kann daher nicht korrekt sein, es fehlt dass der ShippingStatus aus 2 ID zusammengesetzt ist. Kann mir jemand helfen, wie ich das korrekt mappen muss?
 

OnDemand

Top Contributor
Hey , die ist in der Tabelle shipping_status drin und gehört zum Primary Key. Hat keinen Bezug zu einer anderen Tabelle würde ich behaupten. shippig_status_id und language_id sind der zusammengesetzte Primary key. Ist auch kein Autoincrement, seltsam. Dann müsste ich ja die ID selber hochzählen oder?
 

mihe7

Top Contributor
Ich verstehe nicht ganz, wo hier ein zusammengesetzter Primärschlüssel sein soll. Wenn ID die ID des ShippingStatus ist, dann ist das der Primary Key und Language_ID ist einfach eine Referenz auf die Language-Tabelle.
 
K

kneitzel

Gast
Die Kernfrage ist doch:
Gibt es mehrere Einträge mit einer shipping_status_id und unterschiedlichen language_id? In meinen Augen passt das nicht ganz.

Das ist doch eher die Beziehung:
Der Shipping Status hat eine ID, die eindeutig ist (Primary key ist dann nur die id!)
Und dann hat der Shipping Status halt auch eine Sprache zugewiesen.

Wenn beides der Primary Key ist, dann wäre die Sprache auch nicht mehr zu wechseln, da sich ja sonst die id ändern würde und es damit ein anderer Datensatz wäre. Das wird doch auch nicht erwünscht sein.
 

OnDemand

Top Contributor
Ja es gibt zb

1 - 1 -> sofort lieferbar
1 - 2 -> directly shipable

language_id 1 ist englisch und die 2 ist deutsch. Ich finde das auch unglücklich gelöst kann da aber nichts machen da es nicht meine Datenbank ist
 
K

kneitzel

Gast
Och jee, das Design finde ich unglücklich gewählt. Der Status selbst ist ja eher sowas wie:
1 -> Directly shipable

Und die Meldungen sind dann eher in einer weiteren Tabelle shipping_status_messages, in der jeder Eintrag eine ID als Primary Key hat und dann eben noch die shipping_status_id und language_id.
Das wäre dann eine etwas weiter normalisierte Datenbank...

Aber ok, Datenbank ist so vorgegeben.

Hast Du denn in Deinem Product auch eine language id? Oder hast Du nur die shipping_status_id?
 

mihe7

Top Contributor
Man kann es natürlich auch so sehen, dass der Status nur die StatusID ist und man sich die Tabelle dazu gespart hat. Dann gibt es aus Sicht des Produkts aus keine Fremdschlüsselbeziehung (mangels Tabelle) sondern nur den Status.
 

Thallius

Top Contributor
Welche Spezialist hat sch das denn ausgedacht? Eine Lokalisierung gehört doch nicht in eine Datenbank!. Wie wird denn hier eine neue Sprache hinzugefügt? Muss dann jemand die ganzen Datensätze einzippen oder wurde ein extra Programm geschrieben um das zu importieren?

Manchmal kann man wirklich nur mit dem Kopf schütteln...
 

OnDemand

Top Contributor
Genau so hätte ich es auch gemacht, in den Artikelnamen haben sie es auch so gelöst, nur bei den SchippingStati ist so uncool :(
Das Product hat nur eine Referenz auf die shipping_status_id, keine language_id
 
K

kneitzel

Gast
Das Product hat nur eine Referenz auf die shipping_status_id, keine language_id

Dann gibt es aber doch keinen einzelnen Shipping Status sondern mehrere. Sprich: Du bekommst dann alle Stati mit ID 1 - egal welche Sprache die haben. Aber wie man so eine Beziehung darstellen kann? Ich würde das ggf. nicht mehr automatisiert versuchen, sondern die ID wirklich nur als Zahl nehmen. Und dann setzt du da halt nur noch die Zahl/ID und keine Referenz vom Shipping_Status mehr. Aber evtl. hat jemand anderes da ja noch eine andere Idee.
 

OnDemand

Top Contributor
Hab es schon als int versucht, beim Laden eines Product bekomme ich dann aber die Fehlermeldung, dass mehrere Rows mit shipping_status_id 1 geladen wurden (Das Endsystem trägt je Sprache automatisch was dort ein, sodass es IMMER eine ID mit merhreren Sprachen bekommt)

Dann müsste ich das Laden der ShippingStatus komplett deaktivieren (@Transient oder wie kann ich das annotieren?) Dann hole ich mit den ShippingStatus manuell, an den Stellen wo ich ihn brauche. Genau an den Stellen kenne ich dann auch die language_id so ich dann hole ... where shipping_status_id = x AND language_id = y
 

mihe7

Top Contributor
So ist es. Du brauchst ShippingStatus in Product gar nicht, sondern nur eine shippingStatusId. Dort, wo Du die Informationen zum ShippingStatus brauchst, lässt Du Dir sie separat geben. Verwende das aber nicht, um in einer Produkttabelle die Informationen des ShippingStatus anzuzeigen. Dann brauchst Du für jede Produktzeile nämlich einen weiteren SELECT (auch bekannt als das n+1-Problem).
 

OnDemand

Top Contributor
Supi danke! Wie meinst du das mit der Tabelle? Hohe Ladezeit, da ein eigener Select abgegeben werden müsste? Hab ich nicht den Fall derzeit, zumindest nicht in einer Tabelle, sondern eher im Product-Detail
 

OnDemand

Top Contributor
Tip Top. Hab jetzt mein Product geändert, hat nun nur ein

Code:
@Column(name = "products_shippingtime")
private int shippingStatusId;

Somit sollte das passen oder muss ich am ShippingStatus noch was ändern?

Code:
  @Id
@Column(name = "shipping_status_id")
private int shippingStatusId;

@ManyToOne
@JoinColumn(name = "language_id")
private GLanguage language;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand OneToMany löscht Eintrag aus Collection Data Tier 0
OnDemand Hibernate OneToMany oder lieber OneToOne Data Tier 16
D Hibernate Umsetzung multiple OneToMany Beziehung Data Tier 6
C JPA FetchType.LAZY, Relation @OneToMany und Problem mit dem update Data Tier 1
M Hibernate Reads Nulls in OneToMany Data Tier 1
J OneToMany Data Tier 9
H Hibernate Problem mit Lazy Loading bei @OneToMany Collections Data Tier 5
C JPA oneToMany/ManyToOne bidirektional verwirrung Data Tier 6
G Hibernate OneToMany und ManyToOne Objekte löschen Data Tier 13
N Löschen OneToMany Beziehung (delete-orphan) geht nicht Data Tier 2
Y @OneToMany Liste Probleme mit Identity Keys Data Tier 2
F @OneToMany ohne Fremdschlüssel Data Tier 3
G OneToMany undirektional Data Tier 3
D OneToMany ohne Join Table Data Tier 3
G Hibernate Composite key Data Tier 11
S Hibernate: Dauer-Update bei composite-element Data Tier 6
A JPA Postgresql/JPA/EclipseLink - Mapping Fehler? Data Tier 7
G Hibernate Collection Mapping - Fehler beim Updaten der DB Data Tier 0
P Hibernate Mapping - Nur eine Spalte per Join aus anderer Tabelle holen Data Tier 5
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
M Problem mit @Temporal Mapping und SQL Server Data Tier 3
H Hibernate - Mapping für Enumeration Data Tier 1
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
Kessi Hibernate Mapping-File vs. Annotations Data Tier 4
M Hibernate Mapping mal anders Data Tier 2
N Hibernate boolean mapping Data Tier 7
M JPA: Mapping von bestehender DB Data Tier 2
byte Hibernate: duplicate property mapping Data Tier 3
N Mapping einer 1:n in Hibernate Data Tier 11
F OR-Mapping Data Tier 4

Ähnliche Java Themen


Oben