2016-03-31 8 views
1

das folgende einfache Schema Angenommen:Wie wird eine bidirektionale JPA-Beziehung mit einer abstrakten Klasse abgebildet?

Entity Tabelle - Attribute für alle Unternehmen

entityId, timeCreated,... 

Kommentare Tabelle gemeinsam - einige Unternehmen haben eine Sammlung von diesen

entityId, commentId, commentText,.... 

Person Tabelle.

pensonId (entityId), firstName, lastName,... 

Und die folgende Java Vererbungsstruktur:

BaseEntity - abstract - entity, join inheritance with a discriminator 
    CommentedEntity - abstract - introduces `comments` collection - mapping tbd 
     Person - concrete - entity - mapping trivial 

Wie würden wir bidirektionale Beziehung zwischen CommentedEntity und Comment Karte? Der folgende Code ist meine beste Interpretation von Beispielen, die ich gefunden habe.

CommentedEntity

@OneToMany(mappedBy="owner", fetch=FetchType.EAGER) 
private List<Comment> comments = new ArrayList<>(); 

Kommentar

@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name="entityId", referencedColumnName="entityId") 
private CommentedEntity owner; 
  • Seit CommentedEntity eine abstrakte Klasse ist, das funktioniert nicht. owner verweist auf eine unbekannte Entität.
  • Making CommentedEntity eine Entität, würde erfordern, dass es eine ID geben, so glaube ich nicht, dass Sinn macht.
  • Da mehrere konkrete Entitäten eine comments Auflistung haben, kann der Name der konkreten Entität nicht im Mapping verwendet werden.

Wie würden wir dann bidirektional eine person.commentList-Eigenschaft zuordnen?

+0

Sie haben eine OneToMany in __Person__ across zu __Comment__ eingeben, aber keine Ahnung, was dieser Typ ist. Sie haben ein ManyToOne in __CommentedEntity__ zu __CommentedEntity__ ?! (meinst du __Person__?) Solange die Feldtypen konsistent sind und persistent (Entity oder MappedSuperclass), dann sollten Sie dies tun können (oder zumindest kann ich mit der Implementierung, die ich verwende) wie diese http: // www.datanucleus.org/products/accessplatform_4_2/jpa/orm/one_to_many_collection.html#join_bi –

+0

Entschuldigung, Neil. Ich musste ein viel einfacheres Beispiel machen und habe einen Fehler gemacht. Die Frage bezieht sich auf bidirektionales Mapping zwischen 'CommentedEntity' und einem' Comment'. "Person" ist nicht im Spiel, da sie diese Zuordnung von ihrem übergeordneten Element erben würde. Entschuldigung für die Verwirrung. – jacekn

+0

Ich habe mir den Link angesehen, den Sie angegeben haben. Mein Fall ist genauso wie der Account/Address One beim FK. Wo Sie konkret "Account" verwenden, müsste ich eine Zusammenfassung "CommentedEntity" einfügen. – jacekn

Antwort

0

Wenn Person erweitert CommentedEntity dann würden Sie nicht einen CommentedEntity brauchen owner für die Person Entität weil Person is part of a CommentedEntity`. Mit anderen Worten, ein Eigentümerfeld ist nicht erforderlich, da eine Person eine KommentarEntität ist.

+0

Aber ein bidirektionales Mapping erfordert einen Besitzer. 'mappedBy =" Besitzer "'. Können Sie ein Beispiel dafür geben, wie Sie dies abbilden würden? – jacekn

+0

Es gibt kein bidirektionales Mapping, wie Sie es beschreiben. Es ist lediglich eine Entität, "Person", die eine Unterklasse von "CommentedEntity" ist, die eine Unterklasse von "BaseEntity" ist. Was hat eine Sammlung von Personen? –