Situation
Ich habe eine Entität mit DiscriminatorColumn
, die für die Vererbung einzelner Tabellen konfiguriert ist:
%Vor%
'ContainerAssignment' hat einen Verweis auf eine andere Entität:
%Vor%
Ein Container kann ein ContainerAssignment
von jedem TYPE haben. Dies bedeutet, dass der Primärschlüssel der Tabelle ContainerAssignment
durch CONTAINER_ID
und TYPE
definiert ist.
ContainerAssignment
hat einige Unterklassen, z. B.
%Vor%
Es wird nur eine einzige SomeTypeOfContainerAssignment
Instanz für eine gegebene CONTAINER_ID
geben.
Problem
Wenn ich die JPA @Id
nur als Container für die ContainerAssignment-Tabelle definiere, kann ich entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
machen, was großartig ist. Dies läuft in etwa nach SELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1 AND TYPE = 'SOME_TYPE';
. Es weiß, dass es die TYPE-Überprüfung hier wegen der @DiscriminatorValue("SOME_TYPE")
Annotation auf der Entität benötigt.
Dies bedeutet jedoch, dass die Rückverweise von Container auf Container-Zuordnung abbrechen, da der Container nicht wirklich der Primärschlüssel ist. Wenn Container zum Beispiel einen @OneToOne(mappedBy=container) private SomeTypeOfContainerAssignment assignment;
hat, wird beim Lesen eines Containers die Zuweisung von etwas wie SELECT * FROM CONTAINER_ASSIGNMENT WHERE CONTAINER_ID = 1;
gelesen, ohne dass der Typ überprüft wird. Dies gibt ihm alle Zuweisungen für einen Container, und dann wählt er einen scheinbar zufällig aus, möglicherweise vom falschen Typ, in welchem Fall er eine Ausnahme auslöst.
Wenn ich stattdessen die JPA @Id
von ContainerAssignment als eine zusammengesetzte ID unter Verwendung von container und type definiere, sind Verweise auf die Unterklassen von ContainerAssignment in Ordnung.
Ich kann jedoch entityManager.find(SomeTypeOfContainerAssignment.class, containerId)
nicht ausführen, da containerId nicht die ID ist. Ich muss entityManager.find(SomeTypeOfContainerAssignment.class, new MyPk(containerId, "SOME_TYPE"))
machen, was den Punkt @DiscriminatorValue("SOME_TYPE")
zu vereiteln scheint. Ich könnte auch nur eine einzelne ContainerAssignment-Entity verwenden, wenn ich den Typ bei der Suche trotzdem angeben muss.
Frage
Gibt es eine Möglichkeit, Arbeitsverweise auf Unterklassen einer einzelnen Tabellenvererbungs-Entität zu haben, wobei der Primärschlüssel auf der Tabelle in der Diskriminatorspalte zusammengesetzt ist, während auch EntityManager.find
nur durch den / die Teil (e) möglich ist des Primärschlüssels, die nicht der Diskriminator sind?