通常は、私がメソッド保存いずれかを呼び出していない場合でも、トランザクションメソッドの最後に保持されます。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
}
おそらく、私は一括更新後に接続を終了する必要がありますか?
PgtoService内のそのメソッドだけでエンティティをデタッチできますか?このクラスでエンティティを同期させる必要のある他のメソッドがあります –
エンティティがデタッチされると、このトランザクションのためにデタッチされたままになります。境界はクラスではなくトランザクション/セッションです(通常はスレッドそれに縛られている) –