通常情况下,如果我更改了一个使用@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
}
也许我应该在批量更新后结束连接?
答案 0 :(得分:0)
标准查询和已更改的实体将单独处理。 Criteria查询刚刚执行,并且管理(通过实体管理器加载)已更改的实体在事务提交时与数据库同步。 如果您想阻止这种情况,则必须从实体管理器中分离这些实体。然后更改将不再传播到数据库