So behandeln Sie JPA-Anmerkungen für einen Zeiger auf eine generische Schnittstelle

8

Ich habe eine generische Klasse, die auch eine zugeordnete Superklasse ist, die ein privates Feld hat, das einen Zeiger auf ein anderes Objekt desselben Typs enthält:

%Vor%

Mein Problem ist, dass Eclipse einen Fehler in der Datei an der OneToOne "Zieleinheit" T "für vorherige ist keine Entität." Alle Implementierungen von MyIfc sind Entitäten. Ich sollte auch hinzufügen, dass jede konkrete Implementierung, die von MyClass erbt, einen anderen Wert für T verwendet (weil T selbst ist), so dass ich das Attribut "targetEntity" nicht verwenden kann.

Ich denke, wenn es keine Antwort gibt, muss ich diese JPA-Anmerkung in alle konkreten Unterklassen von MyClass verschieben. Es scheint nur scheint wie JPA / Hibernate sollte schlau genug sein, um zu wissen, dass alles zur Laufzeit funktioniert. Wundert mich, ob ich diesen Fehler irgendwie ignorieren sollte.

    
HDave 11.05.2010, 05:19
quelle

3 Antworten

8
  

Mein Problem ist, dass Eclipse einen Fehler in der Datei auf der OneToOne "Target Entity" T "für vorherige ist keine Entität."

zeigt

Ja, und selbst wenn T ein Entity erweitert, I ist mir kein JPA-Provider bekannt, der dies unterstützt (das ist sowieso nicht Teil der JPA-Spezifikation). Für mehr Feedback sehen Sie sich JPA Generic entities classes Mappedsuperclass sind nicht möglich! (sehr ähnlicher Thread über EclipseLink ):

  

Nein, Sie können die Entitäten nicht generisch machen. Der Anbieter kann die Beziehung nicht dem spezifischen Typ zuordnen, der in der generischen Definition definiert ist, da dieser Typ zugewiesen wird, wenn die Entität im Code erstellt wird und nicht dort, wo die Entität definiert ist. Bei der Angabe von Generics ist die Sammlung (in diesem Fall) nur auf diese Typen beschränkt. Der Provider kann möglicherweise nicht auf eine Entity-Instanzenbasis restriktiv sein. In einigen Fällen kann das Ändern des Typs dazu führen, dass für eine Entity-Instanz völlig andere Tabellen zugeordnet werden, was definitiv nicht unterstützt wird.

    
Pascal Thivent 11.05.2010, 05:43
quelle
2

Da JDO die Persistenz von Schnittstellenfeldern unterstützt (was ein ähnliches Konzept wie hier ist), und da DataNucleus auf JPA aufgebaut ist Oben auf den JDO-Funktionen, dann würde es wahrscheinlich erlauben, dass Sie ein solches Feld beibehalten (ich habe ein Beispiel mit JDO, das etwas sehr ähnliches tut, aber ohne die Reste Ihrer Klassen und Persistenz-Code zu sehen ist unmöglich, endgültig zu sein). Probieren Sie es aus und sehen Sie, was passiert.

Offensichtlich liegt das jenseits der JPA-Spezifikation. Wenn also die Portabilität ein Problem für Sie ist, sollten Sie zuerst nachdenken.

    
DataNucleus 11.05.2010 08:07
quelle
1

Sie können ein @OneToOne (targetEntity = SuperClassOfT.class) zu Ihren Feldern hinzufügen, damit dies funktioniert.

Sehen Sie sich an, um polymorphe JPA-Entitäten mit generischen Beziehungen zu implementieren

    
logan 21.02.2011 20:10
quelle