Ich habe Probleme beim Zuordnen einer benutzerdefinierten Sammlung mit JPA (Hiberante-Anbieter). Zum Beispiel, wenn ich ein Objekt mit dem Attribut
verwende %Vor%mit
%Vor%in meiner ORM-Datei ist alles in Ordnung; Aber wenn ich "Liste Übereinstimmungen ersetzen" durch
%Vor%, wobei "Übereinstimmungen" wie folgt definiert ist:
%Vor%Es erzeugt folgenden Fehler:
%Vor%Danke für Ihre Aufmerksamkeit!
Sie können, aber Sie müssen sich darauf als eine der gemeinsamen Sammlungen beziehen - List
oder Set
.
so:
%Vor% Warum? Da Hibernate Proxies für Ihre Sammlungen vornimmt, um z. B. das verzögerte Laden zu ermöglichen. Erzeugt also PersistentList
, PersistentSet
und PersistentBag
, die List
sind, aber nicht Matches
. Wenn Sie dieser Sammlung also zusätzliche Methoden hinzufügen möchten, können Sie dies nicht tun.
Weitere Informationen finden Sie in diesem Artikel .
Sie haben jedoch eine Lösung. Verwenden Sie keine Vererbung, verwenden Sie Komposition. Sie können Ihrer Entität beispielsweise eine Methode namens getMatchesCollection()
hinzufügen (zusätzlich zum traditionellen Getter), die folgendermaßen aussieht:
Und Ihre Matches
-Klasse würde aussehen (mit google-collections " ForwardingList
):
Wenn Sie keine Google-Sammlungen verwenden können, definieren Sie einfach ForwardingList
selbst - es ruft alle Methoden des zugrundeliegenden List
Wenn Sie keine zusätzlichen Methoden zum Bearbeiten der Struktur benötigen, definieren Sie keine benutzerdefinierte Sammlung.
Hibernate erfordert, dass persistente Felder mit Auflistungswert als Schnittstellentyp deklariert werden (weil sie für lazy loading-Zwecke durch die Implementierung von Hibernate ersetzt werden). Aus der Referenzdokumentation:
6.1. Beständige Sammlungen
Hibernate erfordert, dass persistente Felder mit Sammlungswert als Schnittstellentyp deklariert werden. Zum Beispiel:
%Vor%Die tatsächliche Schnittstelle könnte sein
java.util.Set
,java.util.Collection
,java.util.List
,java.util.Map
, %Code%,java.util.SortedSet
oder irgendetwas Sie wie ("alles was du magst" bedeutet dich muss eine Implementierung schreiben vonjava.util.SortedMap
.)Beachten Sie, wie die Instanzvariable war initialisiert mit einer Instanz von %Code%. Dies ist der beste Weg zu Sammelwert initialisieren Eigenschaften von neu instanziiert (nicht persistente) Instanzen. Wenn du Machen Sie die Instanz persistent, indem Sie Aufruf von
org.hibernate.usertype.UserCollectionType
zum Beispiel, Hibernate wird tatsächlich die ersetzenHashSet
mit einer Instanz von Hibernate's eigene Implementierung vonpersist()
.
Ihr zweiter Ansatz ist also nicht möglich, zumindest nicht so, wie Sie ihn erklärt haben. Aber um ehrlich zu sein, ich sehe das nicht wirklich.
Tags und Links java jpa hibernate persistence collections