Entityに存在するメソッドの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で正常に動作します。今はJPA 2.0とIBM Websphere 8.5.5.8でEclipselink 2.6.3を使用しています。
注:この問題は、毎回ではなく、新しいオブジェクトが作成されたときにランダムに発生します。
1:1のレイジーフェッチやその他のパフォーマンスの最適化に必要なので、ウィービングが記述されている可能性があります。あなたが強い理由がない限り、私はそれを使うことにします。しかし、この場合、1:mとM:Mの遅延フェッチでは、EclipseLinkが独自のリスト実装をインジェクションできるので、製織は不要です。このエラーは以前は見たことがありませんでしたが、早急な回避策(推奨しません)は、マッピングをeagerとしてマークすることです(コレクションはデフォルトでは怠惰です)。それはあなたのキャッシュ設定と関係があり、GroupBaseの関係でのフェッチを禁止しなければなりません。 GroupBaseはどのように読み込まれましたか。 – Chris
また、JPAを使用している場合、2.3.2では何が「うまくいった」ものでしたか?以前のEclipseLink設定にJPAアノテーションを設定するために、まっすぐ1:1変換を実行しましたか?新しいELライブラリで「現状のまま」の古いJPAコードを使用すると動作しますか?グループはどのように見えますか、Finestにログオンすると記録されるのは何ですか? – Chris
こんにちは@Chris問題を調べてくれてありがとう! 2.3.2では、レイジーロードされたリストの反復処理はうまく動作しました。JPAアノテーションに変換して2.6.3にアップグレードしたとき、私はこの問題を遅延ロードリストの反復で直面します。私は使用していませんし、私は通常のpojoクラスをエンティティに変換しました。ロギングはこのスタックトレースを印刷するだけの興味深いものを表示しません –