我用一個例子來展示這個問題。Spring Data JPA - 爲什麼對返回實體的更改會自動保留?
斷言,我們有一個存儲庫,如以下:
public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {
}
通過延伸JpaRepository
接口,所述ExampleObject
庫繼承的以下方法:
T findOne(ID id);
現在,我觀察到,如果在調用此方法後收到對ExampleObject的引用,則對該方法進行的任何操作都會自動保存到數據庫中,例如:
ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");
閱讀這個問題,我明白這表明ExampleObject
實例是not detached
。
這違背了我的期望。我本來期望,我會需要使用從CrudRepository
繼承了保存方法,以保存更改:
T save(T entity);
會有人還跟確認對象從Spring數據JPA庫返回保持標準附,並解釋如何使用API來標記存儲庫中的方法,以便它只返回分離的引用?
我想象一下,當它與所說的save(T entity)
方法一起使用時,更改實體的狀態也可能會改變它的定義,所以我也希望瞭解如何處理更新標識。
感謝您的意見 - 他們肯定與辦公室其他意見一致!但是,如果將幾個POJO操作作爲事務的一部分進行,此行爲是否會打破該方法的事務性質? – 8bitjunkie
爲什麼呢?您開始一個交易,對任意數量和種類的實體進行任意數量的修改,然後提交交易。要麼所有更改都已提交,要麼所有更改都會回滾。方法的事務方面也適用於它調用的每一個內部方法:事務上下文被傳播。 –
所以...調用'save'方法是不必要的,除非你分離?或者我應該調用另一個方法來確保JPA關閉事務而不是回滾? – kiedysktos