3 Stimmen

JPA-Beziehungen und Polymorphismus

Ich habe die folgende Klassenstruktur (Details werden aus Gründen der Übersichtlichkeit weggelassen):

Zum Beispiel:

@Entity
class A{

@OneToMany
private List<B> b;

@OneToOne
private C c;

}

interface B {

}

@Entity
@Inheritance
abstract class Babstract implements B {

}

@Entity
@PrimaryKeyJoinColumn
class B1impl extends Babstract  {

}

@Entity
@PrimaryKeyJoinColumn
class B2Impl extends Babstract {

}

Ich möchte alle zu C gehörenden B's laden. Die Klasse A verbindet B mit C. B und C wissen nichts von der Existenz des jeweils anderen und ich möchte, dass das so bleibt. Ich kenne den tatsächlichen Implementierungstyp von B nicht und es ist mir auch egal, weil ich den abstrakten Datentyp B (die Schnittstelle) verwende. Die Implementierung kann sich im Laufe der Zeit ändern, zum Beispiel kann eine neue Implementierung von B in einer neuen Version hinzugefügt werden.

Ist dies mit JPA möglich und wie kann ich das tun? Wenn ich richtig liege, kann ich das targetEntity-Attribut nicht verwenden, weil ich die implementierende Klasse nicht kenne und es mir egal ist. B ist polymorph.

2voto

Piotr Punkte 4653

JPA funktioniert nicht gut mit Schnittstellen. Sie müssen B zumindest zu einer abstrakten Klasse mit der Annotation "Entity" machen. Sie können B zu einer völlig leeren abstrakten Klasse machen (mit Ausnahme eines id-Feldes, das Sie benötigen) und dann Vererbung hinzufügen. Der Grund dafür ist, dass es für eine Entität, die einen Verweis auf eine andere Entität haben soll, eine Möglichkeit geben muss, diese Entität in der Datenbank zu referenzieren - und wenn es keine Tabelle für B gibt, dann gibt es keine Möglichkeit, das zu tun.

1voto

James Punkte 18499

JPA bietet keine Schnittstellenunterstützung, einige JPA-Anbieter jedoch schon. Wenn Sie EclipseLink verwenden, können Sie eine @VariableOneToOne-Zuordnung verwenden, um eine Schnittstelle zuzuordnen.

Wenn die B-Schnittstelle nur einen aktuellen Implementierer hat und dies nur ein "irgendwann in der Zukunft" ist, dann würde ich die targetEntity einfach auf Babstract setzen. Wenn "irgendwann in der Zukunft" tatsächlich eintritt (was wahrscheinlich nicht der Fall sein wird), dann können Sie die Mappings ändern.

Siehe, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X