なぜオブジェクトはなく、JPQLクエリを通じて、JPAでIDによって発見されましたか?
質問
私は、オブジェクトを保存スプリング@Transactional
注釈付きのJUnit 4テストケースを持って、それを見つけることを試みます。私はこの実装を使用する場合、テストケースは渡します:
@Override
public EventSummary findEventSummaryById(Integer id) {
return em.find(EventSummary.class, id);
}
これは私がこの実装を使用するときに失敗した(その後、私はテストケースで呼び出す方法の変更):
@Override
public EventSummary findEventSummary(Integer id) {
Query query = em.createQuery("select es from EventSummary as es where es.id = :id");
query.setParameter("id", id);
EventSummary result = (EventSummary) query.getSingleResult();
return result;
}
解決
クエリが古いまたは不正なデータを返さないことをJPA仕様の保証、デフォルトのフラッシュモード(AUTO
)を使用している場合は、あなたがトランザクション内でクエリを実行している場合:
3.6.2クエリおよびFlushMode
フラッシュモードの設定が影響します 次のようにクエリの結果ます。
クエリは、A内で実行されるトランザクション、もし
FlushModeType.AUTO
Query
オブジェクトのセットがある場合、または 持続性のためのフラッシュモード設定 コンテキストはAUTO
(デフォルト)とaは フラッシュモードの設定がされていませんQuery
オブジェクトに指定されました、 持続性プロバイダは責任があります へのすべての更新を確保するための 内のすべてのエンティティの状態 その可能性永続コンテキスト 潜在的に結果に影響を与えます クエリは、の処理に表示され クエリ。永続性プロバイダ 実装がすることによってこれを達成することができます にそれらの実体を洗い流します データベースまたはいくつかの他の手段によって。もしFlushModeType.COMMIT
が設定されています、 内のエンティティに行われた更新の効果 クエリ時に永続コンテキスト 指定されません。public enum FlushModeType { COMMIT, AUTO }
アクティブなトランザクションがない場合、 持続性プロバイダへのフラッシュはなりません データベースます。
あなたはAUTO
を使用していると仮定すると、トランザクションの側面をチェックします。
他のヒント
Тheエンティティは、現在のセッション(エンティティマネージャ)である - それはフラッシュされるのを待って、永続的な状態です。 getメソッド最初にチェックセッションの内容、および基礎となるデータベースへのターンを発見していない場合。それが見つかると返されるので、あなたのケースでは、エンティティはちょうど、同じセッションで保存されています。
更新:それは問題は、したがって、エンティティがデータベースにフラッシュされていない、間違ったトランザクションマネージャを使用しているが判明しました。パスカルの説明を参照してください。
最初のケースでは、IDは整数である
第二に、IDが文字列である
整数文字列を等しくすることはありません。