2017-01-16 16 views
0

通常は、私がメソッド保存いずれかを呼び出していない場合でも、トランザクションメソッドの最後に保持されます。JPAの一括更新が働きますか?私は@Entityでマッピングされたオブジェクトを変更した場合

JPAのEntityManager#CriteriaUpdateを使用してパフォーマンス上の理由から一括更新を行っていますが、オブジェクトのセッターでいくつかのイベントをトリガーする必要があるため、セーブメソッドは呼び出しません。

私が知りたいのは、一括更新が一括更新が実行されていても、私は、オブジェクトを変更する場合に便利である、または各オブジェクトが永続化される場合はありますか?

PgtoDAO:

public void bulkUpdateStatus(List<Long> pgtos, Long newStatusId) { 
    CriteriaBuilder cb = this.manager.getCriteriaBuilder(); 

    CriteriaUpdate<Pgto> update = cb.createCriteriaUpdate(Pgto.class); 
    Root e = update.from(Pgto.class); 

    update.set("status", newStatusId); 
    update.where(e.get("id").in(pgtos)); 

    this.manager.createQuery(update).executeUpdate(); 

} 

がPgtoService:

@Transactional(readOnly = false) 
public int changePgtosStatus(List<Pgto> pgtos, StatusEnum newStatus){ 
    ... 
    List<Long> pgtoIds = new ArrayList<Pgto>(); 
    for(Pgto pgto : pgtos){ 
    // Hibernate will persist each object here, individually? 
    pgto.setStatus(newStatus.id()); 
    pgtoIds.add(pgto.getId()); 
    } 

    pgtoDao.bulkUpdateStatus(pgtoIds, newStatus.id()); 

    // I tried setting a different status here to the objects, but it did not persisted 

} 

おそらく、私は一括更新後に接続を終了する必要がありますか?

答えて

0

基準のクエリと変更されたエンティティは別々に処理されます。基準クエリはちょうどエンティティがコミットトランザクション上のデータベースと同期されている変更を実行、および(エンティティマネージャを介してロード)管理されています。 あなたはこれを防ぐのが好きならば、あなたは、エンティティマネージャからそれらのエンティティをデタッチする必要があります。変更はデータベースにもう伝播されません

+0

PgtoService内のそのメソッドだけでエンティティをデタッチできますか?このクラスでエンティティを同期させる必要のある他のメソッドがあります –

+1

エンティティがデタッチされると、このトランザクションのためにデタッチされたままになります。境界はクラスではなくトランザクション/セッションです(通常はスレッドそれに縛られている) –

関連する問題