Nach einem Upgrade von Hibernate 3 auf 4 arbeiten wir ein paar Knicke durch, die auf dem Weg auftauchen. Eine, die uns besonders ratlos macht, ist eine UnsupportedOperationException, bei der ein vorhandenes Objekt aus der Datenbank gezogen, optimiert und zusammengeführt wird.
Das Problem besteht darin, dass Hibernate scheinbar ein Objekt zu einem AbstractList
Dies scheint nur bei einem bestimmten Objekttyp zu passieren, wenn es in unserem DAO gespeichert wird, aber so gut wir es sehen können:
AbstractList
types ist. Hier sind die Code-Snippets um die Stack-Punkte:
HibernateDao.save ():
%Vor%Unser Element Benutzer , das gespeichert wird, enthält eine Anzahl von untergeordneten Elementen, die wie folgt definiert sind:
%Vor% Die Project
-Klasse hat andere ähnlich annotierte Kinder, aber alles hat CascadeType.ALL
und LazyCollectionOption.FALSE
definiert.
Hier ist der (ziemlich große) Stack-Trace:
Beachten Sie, dass unser Code mit com.company.application
Wir sind nicht sicher, woher die AbstractList kommt, oder wie wir verantwortlich sind. Gibt es mögliche Probleme bei der Arbeit mit Hibernate 4 (dieses Problem ist seit der Aktualisierung neu), die zu teilweise nicht änderbaren Objekten führen können? Oder würde dies dazu führen, dass Hibernate so agiert, dass es versucht, nicht änderbare Instanzen von Objekten zu erstellen?
@OneToMany (Kaskade = CascadeType.ALL) @LazyCollection (LazyCollectionOption.FALSE) private Map associatedProjects = new HashMap ();
Wie wäre es, dies hinzuzufügen.
@ OneToMany (cascade = CascadeType.ALL)
* @ JoinColumn (name="") *
@LazyCollection (LazyCollectionOption.FALSE) private Map associatedProjects = new HashMap ();
Ich stieß auf das gleiche Problem (mit Sets
nicht Lists
) und es scheint wie Hibernate's Persistent-Variante der fraglichen Sammlung versucht, an eine abstrakte Basisklasse zu delegieren, die nicht die Methode add
implementiert. Die Lösung, die ich gefunden habe, war, das Datenelement auf null zu setzen, ein merge
auszuführen und dann das Datenelement auf die neue Liste zurückzusetzen, die es enthalten soll. Der offensichtliche Nachteil ist, dass ich alle Datensätze wegbreche, auch wenn ich nur einen hinzufügen oder entfernen möchte. Der Vorteil ist, dass es tatsächlich funktioniert ...