0
通常情況下,如果我更改使用@Entity映射的對象,即使未調用任何保存方法,它也會在事務性方法結束時保留。JPA的批量更新在更改對象時起作用?
我正在使用JPA的EntityManager#CriteriaUpdate進行批量更新,但我需要在對象的setter中觸發一些事件,因此我設置了它們,但不調用save方法。
我想知道的是如果批量更新是有用的,如果我更改對象,或每個對象將被持續,即使批量更新被執行?
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中僅使用該方法分離實體嗎?還有其他的方法需要在這個類中同步實體 –
一旦實體被分離,它將保持這個事務的分離 - 所以邊界不是類,而是事務/會話(並且在大多數情況下線程,因爲它通常是綁定它) –