2017-01-16 94 views
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 

} 

也許我應該結束批量更新後的連接?

回答

0

將條件查詢和更改的實體分開處理。 Criteria查詢只是執行,並且託管(通過實體管理器加載)更改的實體與事務提交上的數據庫同步。 如果你想防止這種情況,你將不得不從實體經理分離這些實體。然後更改將不會傳播到數據庫

+0

我可以在PgtoService中僅使用該方法分離實體嗎?還有其他的方法需要在這個類中同步實體 –

+1

一旦實體被分離,它將保持這個事務的分離 - 所以邊界不是類,而是事務/會話(並且在大多數情況下線程,因爲它通常是綁定它) –