UnsupportedOperationException beim Zusammenführen eines vorhandenen Hibernate-Modellobjekts?

9

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

hinzufügt

Dies scheint nur bei einem bestimmten Objekttyp zu passieren, wenn es in unserem DAO gespeichert wird, aber so gut wir es sehen können:

  1. Wir verwenden keine sublist () - oder asList () -Methoden, die eine unveränderbare Instanz erzeugen würden.
  2. Untersuchen Sie das Objekt, das gespeichert wird (das riesig ist und viele Kinder hat). Ich glaube nicht, dass eines seiner untergeordneten Elemente 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

beginnt %Vor%

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?

    
Craig Otis 04.06.2012, 22:40
quelle

3 Antworten

1

@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 ();

    
Myo 10.09.2013 09:17
quelle
0

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 ...

    
Chris Thompson 28.04.2014 15:33
quelle
0

Verwenden Sie diesen Transaktionstyp:

%Vor%     
Mohsen Kashi 29.11.2015 07:55
quelle

Tags und Links