2014-05-09 101 views
1

沃金我有一個靜態方法在實體@Transactional不是在JPA實體

@Transactional 
public static void updateState() { 
    entityManager().createNativeQuery("UPDATE TABLEA SET hide = 1 WHERE id= 1").executeUpdate(); 
} 

但是當我調用該方法,我抓住一個異常說update語句需要一個事務。

我是否以錯誤的方式使用@Transactional

+0

具有u在你的配置中定義的任何註解驅動的事務管理器? –

+2

有兩件事是錯誤的,首先'@ Transactional'不適用於靜態方法,其次它只適用於Spring Managed bean,我懷疑你的JPA實體是Spring Managed。 –

回答

1

看起來你正試圖讓你的Entity成爲一個胖域模型(而不是Java EE世界中最常見的瘦模型),它跟隨着Active Record模式。 你試圖做的事情不會像在Spring中那樣工作。

如果你重構你的方法不是靜態的(第一個問題),那麼得到@Transactional在JPA實體上工作的一種方法是使用Spring的@Configurable註釋(使它由Spring管理 - 因此修復第二個問題),以及加載時間編織和Java代理。有關更多詳細信息,請參閱thisthis

0

也許你應該嘗試用註釋:

@Transactional(readOnly=false) 
+0

如果你閱讀文檔,你會發現指定'readOnly = true'只是一個**提示**來休眠以試圖執行某些(數據庫特定的)優化的操作,這些優化只有在不改變任何數據。指定'readOnly = false'完全是多餘的。 – JamesENL

+0

不知道他的配置是什麼,指定readOnly = false清楚!像spring/hibernate等這些工具的問題是,人們認爲這是多餘的,讓我們生成代碼或者這個註解會做魔法,但是閱讀文檔:http://docs.spring.io/spring/docs/3.0。 x/spring-framework-reference/html/transaction.html表明這個註釋優先於其他配置,假設在這個方法的spring配置文件中有一個readOnly = true,我們沒有從他的問題中得到任何其他信息。 。 –