2013-03-07 3 views
7

Ich versuche kürzlich, Schnittstellen für einige meiner Hibernate Mapped Entities einzuführen und kann nicht herausfinden, wie man das Mapping konfiguriert.Hibernate Interface Mapping ohne Annotationsparameter "targetEntity"

Wenn ich die Schnittstelle ohne weitere Erklärungen verwendet, ich habe immer die folgende Ausnahme:

org.hibernate.MappingException: Could not determine type for: ...MyInterface 

Dann fand ich heraus, dass alles funktioniert gut, wenn ich die targetEntity explizit definieren:

@OneToOne(targetEntity=InterfaceImpl.class) 
    private MyInterface myInterface; 

Leider funktioniert diese Lösung in meinem Fall nicht: Ich kann targetEntity nicht durch Annotation definieren, da ich diese Klasse in eine allgemeine externe Bibliothek extrahieren möchte, die die endgültige Implementierung der Schnittstelle nicht enthält und auch nicht kennt.

Gibt es also eine alternative Möglichkeit zu deklarieren, welche Implementierung verwendet werden sollte, die ich außerhalb der extrahierten Bibliothek verwenden könnte? enter image description here

Antwort

1

Definieren Sie Ihren Mapping-Vertrag in einem abstrakten @MappedSupperclass und überschreiben Sie es dann mit @AssociationOverride in der Implementierungsklasse.

+0

Gute Idee, technisch. Leider brauche ich wirklich Schnittstellen. Abstrakte Superklassen werden den Trick nicht machen, da ich Multi-Vererbung benötigen würde, um sie meinen Bedürfnissen anzupassen. Der Benutzer (siehe Beispiel oben) sollte in der Lage sein, mehrere Schnittstellen zu implementieren. Zum Beispiel ist er sowohl Autor von BlogArticles als auch Autor von Kommentaren. Ich habe das oben nicht erwähnt. Es tut uns leid. – Pumuckline

1

Ich bin nicht sicher, wie es mit Hibernate Annotations arbeiten, aber ich habe etwas ähnliches beschrieben here

letzten Beitrag anzeigen für eine ziemlich ausführliche Erklärung.

Das grundlegende Bedürfnis war ähnlich in dem Sinne, dass wir Schnittstellen in Hibernate-Mapping-Dateien angegeben und die Implementierungen waren Klassen, die hauptsächlich zur Laufzeit mit javassist erstellt wurden (sie waren keine Compile-Zeit).

Was Sie brauchen, ist Code, der zur Laufzeit der Implementierungsklasse von der Schnittstelle und umgekehrt und verwenden, um die Hibernate tuplizer/instantiator Verträge als Erweiterung Punkt auflösen kann, damit Hibernate

(a) erstellen Implementierung Instanzen, bei denen eine Entität aus der DB gefüllt werden muss und (b) die Meta-Daten für das Hibernate-Mapping suchen, wenn eine Entität (Implementierungsinstanz) in der Datenbank gespeichert werden muss.