親と子の間に単純なOneToMany関係があります。EclipselinkでIndirectListのインスタンス化を避ける
親:
@OneToMany(mappedBy = "parent", orphanRemoval = true, cascade = CascadeType.ALL)
private List<Child> children = new ArrayList<>();
が子供:
@ManyToOne(optional = false)
@JoinColumn(name = "PARENT_ID", nullable = false)
private Parent parent;
親は私がLazy Instantiation of Indirect Collectionsを利用したかった子どもたちの大きな量を持つことができるので:
IndirectListとIndirectSetすることができます追加または削除するときにデータベースからリストをインスタンス化しないように構成する必要があります。 IndirectListの既定値はこの動作です。 trueに設定すると、このTransparentIndirectionに関連付けられたコレクションは、追加と削除のインスタンス化を行わないようにセットアップされます。 IndirectSetのこの設定の弱点は、セットがインスタンス化されていない場合、重複した要素が追加された場合、コミット時まで検出されないことです。
デフォルトでOneToManyのFetchTypeがLAZYで、私のコレクションにListを使用しているため、データベースから親をロードすると、その関係にIndirectListが使用されます。その親に別の子を追加するとすぐに、その親の子に対する選択クエリが実行されていることがわかります。
どうすれば変更できますか? Eclipselink 2.6.4(org.eclipse.persistence:eclipselink:2.6.4
)を使用しています。
また、私の関係でorg.eclipse.persistence.mappings.CollectionMapping.setUseLazyInstantiationForIndirectCollection(Boolean)
を呼び出すためにDescriptorCustomizerを使用しようとしましたが、これは全く効果がないようです。
方法org.eclipse.persistence.indirection.IndirectList.add(E)
にデバッグした後、私はラインでorg.eclipse.persistence.indirection.IndirectList._persistence_getPropertyChangeListener()
1007に戻り、ヌル、ヌルはinstanceofはAttributeChangeListenerではないので、ライン206でorg.eclipse.persistence.indirection.IndirectList.shouldAvoidInstantiation()
へのメソッドの呼び出しは、falseが返されていることを確認することができました。このため、関係は行216のorg.eclipse.persistence.indirection.IndirectList.getDelegate()
によってインスタンス化されます。
私にはこれはバグのようですが、この実装については十分に分かりません。
バイトコードのエンハンスト/ウィービングを使用していますか?変更トラッキングは、あなたが探しているものをサポートするために必要であると考えています。ここで説明するように織りを使って有効にしています。https://www.eclipse.org/eclipselink/documentation/2.5/concepts/app_dev007.htm – Chris
ありがとうございます@Chrisあなたは正しいです私はeclipselink jarを私の実行コンフィギュレーションのエージェントjarとして追加せずに、テストシナリオをeclipseで実行していました。私はちょうどその製織は、Java eeアプリサーバーではデフォルトで有効になっていたので、私はそれについて考えなかったと読んでいます。私は私のアプリケーションサーバーを使用してテストを実行するとすべてが問題なく、エージェントのjarファイルを追加することでその問題を修正しています。あなたが望むなら、あなたのコメントでこの質問を認めることができます。私はそれを受け入れます。 – Adrodoc55