なぜオブジェクトはなく、JPQLクエリを通じて、JPAでIDによって発見されましたか?

StackOverflow https://stackoverflow.com/questions/3418160

質問

私は、オブジェクトを保存スプリング@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が文字列である

整数文字列を等しくすることはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top