2011-07-22 152 views
0

我正在開發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對象的更改不是。

所以我的問題是:

  1. 有我瘋狂誤解了Hibernate事務的一些概念?
  2. 爲什麼在向其他事務性conService類添加調用時,我的原始對象現在開始持續保留
  3. 爲什麼不讓Team對象更改持久? (OBV我不想讓這個代碼在這裏,但有興趣瞭解到底是怎麼回事)

感謝

回答

0

好吧,這好像添加了調用其他服務類是一個紅色的鯡魚 - 看起來很多持久性有點片面,如果我清理項目並重新啓動服務器,然後原始代碼正常工作。

有沒有其他人發現它?我正在使用Elcipse Gallileo和Tomcat。