2016-06-21 8 views
1

は誰のアイデアなぜJPAプロバイダを持っている - (バージョン2.6.0を使用して)のEclipseLinkは次のようにクエリを生成します。それはIDがIDを提供し得る必要があるのはなぜEclipselink 2.6.0クエリの目的 - SELECT ID FROM TBL WHERE ID =?

SELECT ID FROM OPERATION WHERE (ID = ?); 

または

SELECT ID FROM SUBSCRIPTION WHERE (ID = ?); 

...

第1レベルまたは第2レベルのキャッシュ同期ですか? おそらく私の質問が不正確です... 私の質問では、これを直接実行することは決してありません - 私はJPQLを使用し、IDを与えるIDを求めることはありません。

私はかなり複雑なモデルとクエリを持っているので、完全なコードを提供することには意味がありません(または、Uが本当に主張している場合にのみ、私はそれが多くを助けるとは思わない)。 Oracle 12c DBの使用。

+2

おそらく、これらのクエリは、指定された行が存在するかどうかを確認するだけです。 – antlersoft

+0

これらのテーブルにマップしたものとクエリの時点で実行しているものを確認する必要があります。最も簡単な方法は、テーブルを削除してスタックトレースを確認することです。しかし、彼らはキャッシュ同期とは何の関係もありません。なぜなら、エンティティ全体を読み取る必要がない限り、データベースはそれに関与していないからです。 – Chris

答えて

1

EclipseLink 2.5.2を使用して、Javaアプリケーションで同じ問題が発生しました。具体的には、別のエンティティとのM:1の関係を持つ新しいエンティティを挿入するたびに、簡略化ユースケースは次のようになります。

A a = new A(); // the new entity 
B b = lookupB(); // get existing entity from database 
a.setB(b); // set M:1 relationship 
em.persist(a); // save 

この場合、我々は常にB(即ち、SELECT ID FROM B WHERE ID = @)のクエリを見ることになります。いくつかの調査の後、レコードをマージする前に、EclipseLinkが実行するexistence checkingまで追跡しました。

Bのエンティティクラスに@ExistenceChecking(ExistenceType.ASSUME_EXISTENCE)という注釈を付けると、EclipseLinkはクエリを実行できませんでした。

この詳細については、related postを参照してください。

関連する問題