2012-02-22 10 views
0

外部キーを持つオブジェクトを永続化すると、eclipselinkがオフになり、次のような検証クエリがログに記録されます。 eclipselinkがこのオブジェクトを見つけてバインドすることも確認します。私はそれがこれらの事のどちらかをしたくない。EcliplLink JPAの使用オブジェクトを永続化するときに、どのように関係検索を無効にするには?

基本的に私はオブジェクトAを保存しようとしていますが、AはオブジェクトBとの関係を持っています。新しいAを挿入すると、クラスBのインスタンスではなくBのIDですこの場合、Bのインスタンスを取得することには関心がありません。

このような何か:

String b_id = "12345"; 
A a = new A(); 
B b = new B(); 
b.setId(b_id); 
a.setB(b); 


//begin tran 
try { 
    em.persist(a); 
//commit 
} catch (Exception e) { 
    e.printStackTrace(); 
    //rollback 
} 

ログでこれが発生します。

Execute query DoesExistQuery(referenceClass=B) 
SELECT ID FROM B WHERE (ID = ?) 
bind => [12345] 

は、今私はEclipseLinkのは、このIDとBが存在するかどうかを確認するために行くことなくAを挿入すると、私はこのBをBのインスタンスであるAのフィールドにバインドしたくありません。

Eclipselinkがこのオーバーヘッドを挿入に追加したくないのは、データベースが実行されるためですとにかく挿入前の検証です。この場合、Bの実際のインスタンスは必要ありません。

返信いただきありがとうございます!

答えて

1

これは通常EntityManager.getReference()メソッドの役割です:それは作成し、データベースを押すことなく、指定されたクラスやIDを持つエンティティにプロキシを返します。

A a = new A(); 
B b = em.getReference(B.class, bId); 
a.setB(b); 

私もEclipseLinkは経験がありません、だから私は正確にこのクエリが実行されているかわかりません。

+0

これはやっているようでした!私はまだ選択とログのバインドが表示されますが、 "Execute query DoesExistQuery"は表示されませんので、私たちは明確であると想定しています。ありがとう! – jhnclvr

1

A < - > B関係のカスケードアノテーションにより、余分な呼び出しが決定されます。おそらくあなたはCascadeType.ALLを持っていて、あなたが望むものはCascadeType.REFRESHとCascadeType.REMOVEだけです。

2

おそらく、getReferenceを使用するのが最適です。また、記述子(@ExistenceChecking(ASSUME_EXISTENCE))でDoesExistポリシーをカスタマイズすることもできます。

関連する問題