2017-06-05 15 views
0

Ich erhalte den folgenden Fehler, wenn ich versuche, Lazy geladen @oneToMany Beziehungsattribut in einer Methode in Entität vorhanden.Eclipselink: Operation nicht unterstützt: [instanziateForUnitOfWorkValueHolder]

Fehler:

Caused by: Exception [EclipseLink-7097] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Operation not supported: [instantiateForUnitOfWorkValueHolder]. 
    at org.eclipse.persistence.exceptions.ValidationException.operationNotSupported(ValidationException.java:1496) 
    at org.eclipse.persistence.internal.indirection.ProtectedValueHolder.instantiateForUnitOfWorkValueHolder(ProtectedValueHolder.java:61) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:160) 
    at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:234) 
    at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:89) 
    at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:271) 
    at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:455) 
    at org.eclipse.persistence.indirection.IndirectList$1.<init>(IndirectList.java:597) 
    at org.eclipse.persistence.indirection.IndirectList.listIterator(IndirectList.java:596) 
    at org.eclipse.persistence.indirection.IndirectList.iterator(IndirectList.java:555) 
    at com.order.modelGroupBase.getStatus(GroupBase.java:205) 

Entity:

@Entity 
@Table(name="GROUP") 
@Customizer(GroupBaseCustomizer.class) 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@ClassExtractor(GroupClassExtractor.class) 
@InstantiationCopyPolicy 
@Cacheable 
@Cache(alwaysRefresh=true, 
refreshOnlyIfNewer=true, 
expiry=300000,  
coordinationType = CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES) 
public class GroupBase { 

@OneToMany(cascade=CascadeType.ALL, mappedBy="groupBase", targetEntity=Groups.class) 
@PrivateOwned 
private List groups = new ArrayList<>(); 

public OrderGroupStatus getStatus() { 

//error is at this line when I try to iterate.. 
for (Iterator itr = getGroups().iterator(); itr.hasNext();) { 
    Groups relationship = (Groups) itr.next(); 
    //some operation.. 

    }   


} 

} 

ich auf in Eclipse Forum geschaut haben, aber sie gehen nicht auf diese Frage explizit und einige Links sagen, dass es im Zusammenhang mit weben.Aber in meiner Anwendung habe ich überhaupt nicht gewebt, und ich habe auch nicht vor zu tun.

Dieser Code funktioniert gut auf Eclipselink 2.3.2 ohne JPA. Jetzt benutze ich Eclipselink 2.6.3 mit JPA 2.0 und IBM Websphere 8.5.5.8.

Hinweis: Dieses Problem tritt nicht immer zufällig auf und auch wenn ein neues Objekt erstellt wird, ist was ich beobachtet habe.

+1

Weben könnte erwähnt worden sein, da es für das faule Holen von 1: 1 und anderen Leistungsoptimierungen erforderlich ist. Ich würde es benutzen, es sei denn, Sie haben einen starken Grund, es nicht zu tun. In diesem Fall wird das Weben für das faule Holen von 1: m und M: M nicht benötigt, da EclipseLink seine eigene Listenimplementierung einbringen kann. Ich habe diesen Fehler zuvor noch nicht gesehen, aber die schnelle Problemumgehung (nicht empfohlen) besteht darin, das Mapping als "eifrig" zu kennzeichnen (die Sammlungen sind standardmäßig faul). Es muss etwas mit Ihren Cache-Einstellungen zu tun haben und den Abruf der GroupBase-Beziehung nicht zulassen. Wie wurde GroupBase eingelesen? – Chris

+0

Auch was funktionierte in 2.3.2, wenn Sie jetzt JPA verwenden? Haben Sie gerade eine 1: 1-Konvertierung durchgeführt, um JPA-Annotationen auf vorherige EclipseLink-Einstellungen zu setzen? Wenn Sie den alten, nicht-JPA-Code "wie er ist" mit der neuen EL-Bibliothek verwenden, funktioniert das? Wie sehen Gruppen aus und was wird protokolliert, wenn Sie Finest anmelden? – Chris

+0

Hallo @Chris Vielen Dank für das Problem! In 2.3.2 bedeutet die Iteration über die Lazy-Loaded-Liste, dass keine Ausnahme ausgelöst wurde. Als ich in JPA-Annotationen konvertiert und auf 2.6.3 aktualisiert habe, stehe ich in der Iteration der Lazy-Loaded-Liste diesem Problem gegenüber. Ich habe nicht verwendet und ASIS alten Code Ich habe normale Pojo-Klassen in Entitäten umgewandelt. Das Logging zeigt nichts Interessantes, es druckt nur diesen Stack-Trace –

Antwort

0

Nach vielen hit and trails und Korrigieren meiner Einstellungen zum verzögerten Laden habe ich herausgefunden, dass die Verwendung von fetchType für dieselbe Entität in anderen Entitäten dieses Problem im SHARED_CACHE-Modus verursachen kann.

@OneToMany(cascade=CascadeType.ALL, mappedBy="groupBase", targetEntity=Groups.class) 
@PrivateOwned 
private List groups = new ArrayList<>(); 

standardmäßig @OneToMany ist träge abgerufene aber in einem anderen Unternehmen für die gleiche Entität ‚Gruppen‘ hatte ich fetchType als EAGER konfiguriert.

Wenn ich beide Abrufarten zu LAZY gemacht habe, hörte dieser Fehler auf.

Verwandte Themen