Wie erstelle ich einen zusammengesetzten Primärschlüssel, der ein @ ManyToOne-Attribut als @EmbeddedId in JPA enthält?

8

Ich bin gefragt und beantworte meine eigene Frage , aber ich gehe nicht davon aus, dass ich die beste Antwort habe. Wenn Sie einen besseren haben, bitte posten Sie es!

Verwandte Fragen:

Ich habe ein Paar von Klassen, die sich in einer einfachen Aggregationsbeziehung befinden: Jede Instanz von einem besitzt eine Anzahl von Instanzen des anderen. Die besitzende Klasse hat eine Art eigenen Primärschlüssel, und die besessene Klasse hat über einen entsprechenden Fremdschlüssel eine Eins-zu-Eins-Klasse für diese Klasse. Ich möchte, dass die besessene Klasse einen Primärschlüssel hat, der diesen Fremdschlüssel plus einige zusätzliche Informationen enthält.

Lassen Sie uns aus Gründen der Argumentation diese beständigen Favoriten Order und OrderLine verwenden.

Das SQL sieht ungefähr so ​​aus:

%Vor%

Ich möchte dies mit JPA in Java abbilden. Die Reihenfolge ist trivial und OrderLine kann mit einer @IdClass behandelt werden. Hier ist der Code dafür - der Code ist ziemlich konventionell, und ich hoffe, du verzeihst meine Eigenheiten.

Bei der Verwendung von @IdClass wird jedoch eine ID-Klasse geschrieben, die die Felder in der OrderLine dupliziert. Ich möchte diese Duplizierung vermeiden, deshalb möchte ich stattdessen @EmbeddedId verwenden.

Ein naive Versuch scheitert jedoch:

%Vor%

OpenJPA weist die Verwendung als @EmbeddedId zurück. Ich habe andere Anbieter nicht ausprobiert, aber ich würde nicht erwarten, dass sie erfolgreich sind, weil die JPA-Spezifikation erfordert, dass die Felder, die eine ID-Klasse bilden, grundlegend sind, keine Beziehungen.

Also, was kann ich tun? Wie kann ich eine Klasse schreiben, deren Schlüssel die @ManyToOne-Beziehung enthält, aber als @EmbeddedId behandelt wird?

    
Tom Anderson 25.08.2011, 19:19
quelle

1 Antwort

16

Ich kenne keine Möglichkeit, dies zu tun, was keine Verdoppelung von Feldern bedeutet (tut mir leid!). Aber es kann auf eine einfache und standardmäßige Art und Weise erfolgen, bei der nur die Beziehungsfelder dupliziert werden. Der Schlüssel ist die @MapsId Annotation, die in JPA 2 eingeführt wurde.

Die einzubettende Schlüsselklasse sieht folgendermaßen aus:

%Vor%

Und die einbettende Entitätsklasse sieht so aus:

%Vor%

Die @MapsId-Annotation deklariert, dass das Beziehungsfeld, auf das sie angewendet wird, ein Basisfeld neu aus der eingebetteten ID abbildet.

Hier ist der Code für OrderId .

    
Tom Anderson 25.08.2011, 19:37
quelle