Wie wird benutzerdefinierte Sammlung in JPA zugeordnet?

8

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!

    
Denis 04.07.2010, 10:32
quelle

2 Antworten

7

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:

%Vor%

Und Ihre Matches -Klasse würde aussehen (mit google-collections " ForwardingList ):

%Vor%

Wenn Sie keine Google-Sammlungen verwenden können, definieren Sie einfach ForwardingList selbst - es ruft alle Methoden des zugrundeliegenden List

auf

Wenn Sie keine zusätzlichen Methoden zum Bearbeiten der Struktur benötigen, definieren Sie keine benutzerdefinierte Sammlung.

    
Bozho 04.07.2010, 10:44
quelle
4

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   von    java.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 ersetzen    HashSet mit einer Instanz von   Hibernate's eigene Implementierung von persist() .

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.

    
Pascal Thivent 04.07.2010 10:56
quelle