オブジェクト向けのクエリーの深化

4723 ワード

バッチ演算
エンティティを変更するには、連続性コンテキストの変更検出機能またはマージを使用し、削除する場合はem.removeを使用します.
しかし,この方法は大量のデータを1つずつ処理するのに時間がかかりすぎる.
このようなデータを一度に複数削除処理する場合には、一括演算を用いる.
// 수정
String updateJpql = "update Product p set p.price = p.price * 1.1 where p.stockAmount < :stockAmount"l

int upResultCnt = em.createQuery(updateJpql)
	.setParameter("stockAmount", 10)
    .executeUpdate();
    
//삭제

String deleteJpql = "delete from Product p where p.stockAmount < :stockAmount";

int delResultCnt = em.createQuery(deleteJpql)
	.setParameter("stockAmount", 10)
    .executeDelete();
注意点
バッチ演算は、永続性コンテキストを無視し、クエリーをデータベースに直接送信することに注意してください.
解決策
1.em.refresh()
一括演算の後、em.refresh()にdebeでエンティティを再問合せするように強制します.
2.一括演算を先に実行する
3.一括演算を実行した後、永続性コンテキストを初期化する
持続性ContextとJPQL
クエリー後に永続的な状態にあるかどうか.
JPQLを使用してエンティティを問い合わせると、エンティティは永続コンテキストで管理されますが、埋め込みタイプや値タイプは永続コンテキストでは管理されません.
JPQLクエリーを使用したエンティティおよび永続性コンテキスト
永続性コンテキストにメンバー1があり、JPQLでメンバー1を再度問い合わせると、
2番目に見つかったJPQLは、会員1が破棄され、既存の永続性コンテキストの会員1に戻ります.
永続コンテキストは、永続的な状態にあるエンティティの一貫性を保証する必要があります.
JPQLはDialexを使用してDebeを検索し、必要な識別子に関連するエンティティを検索し、永続性コンテキストに保存して返します.
JPQLとリフレッシュモード
FlushMode.AUTOよりFloushModeCOMMITは性能が良い.したがって、リフレッシュモードを「コミット」に設定した場合、JPQLを使用しても必要な値が得られない場合があります.
永続性コンテキストのエンティティの値を変更し、JPQLを使用してエンティティを検索した場合(リフレッシュ・モードがコミットで、JPQLを実行するまでリフレッシュされません)、変更前の値を受け入れます.
この場合.
product.setPrice(2000);

//em.flush(); 를 하던가

Product product2 = em.createQuery("select p from Product p where p.price = 2000" ,Product.class)
	.setFlushMode(FlushModeTpye.AUTO) // 를 해야한다.
    .getSingleResult();
FlushMode.COMMITモードは、トランザクションのコミット時にのみリフレッシュされ、クエリの実行時にはリフレッシュされません.
したがって、JPAクエリーを使用する場合、データベースに反映されていないデータを永続的なコンテキストでクエリーすることはできません.
この場合、データの整合性に深刻な影響を及ぼします.
それでも、コミット・モードでは、クエリーのリフレッシュ回数を減らすことでパフォーマンスを最適化できます.