2014-09-10 64 views
1

我有一個Java應用程序,它使用Spring Data(與JPA和Hibernate)通過服務和存儲庫層與數據庫進行交互。它的大部分工作正常,但我有一個問題測試節省呼籲組成的對象:使用Spring Data/JPA/Hibernate與分離實體測試保存調用

涉及三個對象:

  • 目標AI從數據庫
  • 對象BI獲得創造的一個新實例在測試
  • 對象CI要保存到具有多對一關係到對象A和一對一的關係向對象B的數據庫(和兩者的情況下附連到它)

(級聯設置合併並堅持)

現在,當試圖使用對象C的服務保存它時,我得到一個分離實體異常。在將@Transactional放在測試方法的頂部時,我無法檢查數據庫的狀態,因爲事務仍處於打開狀態。 (用@Transactional單獨的方法檢索和創建對象+保存調用沒有做任何事情,試圖抓住實體管理器並沖洗它也沒有幫助。)

我敢肯定這可能是一個常見問題(或者只是我的誤解),但我還沒有找到任何解決方案,並會感謝任何建議。

版本中使用:

  • 春4.0.5
  • JPA 2.1
  • 的Hibernate 4.3.5

回答

0

你必須首先堅持對象B或添加級聯歸因於關係註釋,例如

@OneToMany(cascade = CascadeType.ALL, mappedBy = "field") 

這將級聯通過關係的所有操作。

+0

感謝您的回覆,但級聯類型已設置爲MERGE和PERSIST – DrunkenPope 2014-09-10 15:11:31

0

更新到Spring 4.1.0幫助我解決了這個問題。在Spring 4.1.0中,有一個新類TestTransaction,它可以在事務處理期間提交(我需要用@Transactional來避免分離的實體),因此您可以檢查數據庫的狀態。

看起來好像你必須關閉連接才能實際提交併重新打開它來檢查數據庫。我使用了這樣的提交調用:

private void commit() { 
    TestTransaction.flagForCommit(); 
    TestTransaction.end(); 
    TestTransaction.start(); 
} 

如果您知道更簡單/更好的使用方法,請告訴我。但是這對我來說是個訣竅。