0
當我嘗試訪問實體中存在的方法中的Lazy加載的@oneToMany關係屬性時,出現以下錯誤。Eclipselink:不支持的操作:[instantiateForUnitOfWorkValueHolder]
錯誤:
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
@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..
}
}
}
我在論壇的EclipseLink白眼,但他們並沒有明確解決這個問題,一些鏈接說這是關係到編織。但在我的應用程序中,我根本沒有編織,我也不打算這樣做。
此代碼在沒有JPA的Eclipselink 2.3.2上正常工作。現在我使用Eclipselink 2.6.3和JPA 2.0以及IBM Websphere 8.5.5.8。
注意:這個問題是隨機發生的,並不是每次都是這樣,而且當創建一個新的對象時也是我所觀察到的。
編織可能已被提及,因爲它需要1:1的懶取得和其他性能優化。除非你有充分的理由不這樣做,否則我會考慮使用它。但是,在這種情況下,由於EclipseLink可以注入自己的列表實現,所以對於1:m和M:M的延遲獲取不需要編織。我之前沒有看到這個錯誤,但快速解決方法(不推薦)是將映射標記爲渴望(默認情況下集合是懶惰的)。它必須與您的緩存設置有關,不允許在GroupBase關係上進行提取。 GroupBase是如何讀取的。 – Chris
另外,如果您現在使用JPA,那麼2.3.2中的'working'是什麼?您是否直接進行1:1轉換,將JPA註釋設置爲以前的EclipseLink設置?如果您在新的EL庫中「按原樣」使用舊的非JPA代碼,它是否有效? Groups是什麼樣子的,如果你把日誌記錄在Finest上會記錄什麼? – Chris
嗨@Chris感謝您關注此問題!在2.3.2中,延遲加載列表的迭代運行良好意味着沒有任何異常拋出。當我轉換爲JPA註釋並升級到2.6.3時,我在迭代延遲加載列表中遇到了這個問題。我沒有使用和ASIS舊代碼,我已經正常pojo類轉換爲實體。日誌記錄不顯示任何有趣的事情,只是打印這個堆棧跟蹤 –