2017-06-05 16 views
0

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のレイジーフェッチやその他のパフォーマンスの最適化に必要なので、ウィービングが記述されている可能性があります。あなたが強い理由がない限り、私はそれを使うことにします。しかし、この場合、1:mとM:Mの遅延フェッチでは、EclipseLinkが独自のリスト実装をインジェクションできるので、製織は不要です。このエラーは以前は見たことがありませんでしたが、早急な回避策(推奨しません)は、マッピングをeagerとしてマークすることです(コレクションはデフォルトでは怠惰です)。それはあなたのキャッシュ設定と関係があり、GroupBaseの関係でのフェッチを禁止しなければなりません。 GroupBaseはどのように読み込まれましたか。 – Chris

+0

また、JPAを使用している場合、2.3.2では何が「うまくいった」ものでしたか?以前のEclipseLink設定にJPAアノテーションを設定するために、まっすぐ1:1変換を実行しましたか?新しいELライブラリで「現状のまま」の古いJPAコードを使用すると動作しますか?グループはどのように見えますか、Finestにログオンすると記録されるのは何ですか? – Chris

+0

こんにちは@Chris問題を調べてくれてありがとう! 2.3.2では、レイジーロードされたリストの反復処理はうまく動作しました。JPAアノテーションに変換して2.6.3にアップグレードしたとき、私はこの問題を遅延ロードリストの反復で直面します。私は使用していませんし、私は通常のpojoクラスをエンティティに変換しました。ロギングはこのスタックトレースを印刷するだけの興味深いものを表示しません –

答えて

0

多くのヒット曲とトレイルの後でレイジーローディング設定を修正したところ、他のエンティティの同じエンティティで異なるfetchTypeを使用すると、SHARED_CACHEモードでこの問題が発生する可能性があります。デフォルトの@OneToManyによって

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

は遅延フェッチですが、同じエンティティ「グループ」の別のエンティティに私がEAGERとしてfetchTypeを構成していました。

フェッチタイプをLAZYにしたとき、このエラーは発生しなくなりました。

関連する問題