我正在開發Spring/Hibernate應用程序,並在嘗試更新現有對象時看到一些意外的行爲。休眠事務也不會持久化對象更改
目前,我有一個服務類方法如下簡單地更新對象:
@Transactional
public void updateToDoCompletion(long id, boolean completed){
ToDo todo = getEntityManager().find(ToDo.class, id);
if (todo!=null){
todo.setCompleted(completed);
}
}
我的理解是,交易是圍繞方法啓動,ToDo對象被加載(在事務內)和那麼一旦事務結束,我對該對象所做的任何更改都會被持久化(在這種情況下,該方法是從事務外部調用的,在我的控制器類中,因此我期望事務僅用於此方法)。
但是,通過上面的介紹,對對象的更改永遠不會保存到數據庫中。
有趣的是,此更新在事務結束時在幾乎相同的設置工作的其他地方(在預期事務邊界等方面),所以我用的代碼試驗和更新方法如下:
@Transactional
public void updateToDoCompletion(long id, boolean completed){
ToDo todo = getEntityManager().find(ToDo.class, id);
if (todo!=null){
todo.setCompleted(completed);
}
Team t = conService.loadTeam(50l);
t.setDescription("test description!");
}
這次,在對原始對象進行更改之後,我加載了一個不同的對象,並對此進行了更改 - 我這樣做是因爲唯一的區別是我可以看到其他按預期工作的方法,其他類中的事務方法(所以添加的代碼conService.loadTeam(50l)是另一個服務類中的事務方法)。現在,ToDo對象的原始更改正如我所希望的那樣持續存在,但對Team對象的更改不是。
所以我的問題是:
- 有我瘋狂誤解了Hibernate事務的一些概念?
- 爲什麼在向其他事務性conService類添加調用時,我的原始對象現在開始持續保留
- 爲什麼不讓Team對象更改持久? (OBV我不想讓這個代碼在這裏,但有興趣瞭解到底是怎麼回事)
感謝