JPA的批量更新在更改对象时有效吗?

时间:2017-01-16 19:45:29

标签: java hibernate jpa

通常情况下,如果我更改了一个使用@Entity映射的对象,它将在事务方法结束时保留,即使我没有调用任何保存方法。

我出于性能原因使用JPA的EntityManager#CriteriaUpdate进行批量更新,但是我需要在对象的setter中触发一些事件,所以我设置它们,但是不要调用它们保存方法。

我想知道的是,如果我更改对象,批量更新是否有用,或者即使执行批量更新,每个对象都会被保留?

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

}

也许我应该在批量更新后结束连接?

1 个答案:

答案 0 :(得分:0)

标准查询和已更改的实体将单独处理。 Criteria查询刚刚执行,并且管理(通过实体管理器加载)已更改的实体在事务提交时与数据库同步。 如果您想阻止这种情况,则必须从实体管理器中分离这些实体。然后更改将不再传播到数据库