2013-05-09 65 views
0

我正在使用Spring和Hibernate。我有一個註釋爲@Transactional的方法。此方法有兩個數據庫調用。一次調用將更新表中的數據,另一次調用將根據第一次調用的更新數據從同一表中檢索一些數據。 問題是第一次調用的數據庫更改沒有立即反映出來。在用@Transactional註釋的方法流出之後,會反映更改。我仍然嘗試撥打session.flush()但沒有用。請建議我。spring-hibernate事務 - 更改不反映?

@Transactional 
public void method1(){ 
dao.updateM1(); 
dao.getData(); 
} 

回答

1

據我所知在交易方法完成後,只有變化會反映在數據庫中。

但是,您在此方法完成之前調用。因此,您沒有得到更新的結果。

+0

@ user755806您是否瞭解問題 – PSR 2013-05-09 13:36:33

0

據我所知,當你使用@Transaction註解的方法。在方法調用結束時,應該在您的主體邏輯中更改任何數據庫更改。

0

爲什麼數據庫中更新的內容很重要?

想想實體在持久化上下文中的狀態。

也許你應該試試session.refresh()刷新實體的狀態,但是你的代碼不夠詳細,看看爲什麼它不起作用。

您的updateget方法是如何實施的?

2

你能詳細說明你的情況嗎?例如:你聲明什麼傳播級別爲updateM1getData方法?

在情況下,你沒有說明交易的updateM1,並的getData方法,問題是這兩種方法都是在一個相同的事務。因此,直到事務提交之前,Hibernate纔會更新數據。爲了解決這個問題,你剛纔描述的交易,如下面updateM1

@Transactional (propagation = Propagation.REQUIRE_NEW) 
public E updateM1() {} 

就這樣,一個新的交易將創建的每個updateM1被調用時。 updateM1完成後,該新事務將被提交,並且所有更改都將保留在數據庫中。

關於調用Session.flush不工作,這裏是一個明確的答案:Question about Hibernate session.flush()

0

它不建議手動調用session.flush(),我想你可以使用DAO到兩個不同的服務方法的兩個電話分開,使他們有不同的交易傳播屬性,

@Transactional 
public void method1(){ 
    this.updateM1Service(); 
    this.getDataService(); 
} 

@Transactional (propagation = Propagation.REQUIRE_NEW) 
public void updateM1Service(){ 
    dao.updateM1(); 
} 

@Transactional 
public void getDataService(){ 
    dao.getData(); 
}