簡體   English   中英

EJB Transactions屬性:NOT_SUPPORTED和REQUIRES_NEW

[英]EJB Transactions attribute: NOT_SUPPORTED and REQUIRES_NEW

我目前陷入以下情況:

我正在嘗試將對象A保存到數據庫中。 但是A由許多其他對象組成,B,C和B,C由對象D,E組成...有很多嵌套的對象,您知道我的意思。 讓我們將將A保存為事務1的整個過程稱為1。

在事務1的中間,當要保存某個對象X(通過許多鏈接在某種程度上與A相關聯)時,可以說是saveX()方法觸發了保存X。在saveX()方法中,業務邏輯需要對另一個對象Y進行另一個查詢,假設方法是queryY()。

因此,當我們調用queryY()並轉到實際從數據庫中獲取所有結果的代碼行時,就會出現異常。 我們將此時刻稱為T時間。

例外是

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: A.b -> B.

因此,我認為,EJB容器在T時間有點思考,當我們需要執行查詢時,它需要提交當前事務1並啟動事務2來執行查詢。 顯然,與A相關的數據尚未正確保存到數據庫中,因此發生了異常。

因此,我們需要稍微掛起事務1並在執行查詢后恢復它,而不是在T時間提交它。 我做了一些研究,發現@TransactionAttribute可以解決問題。 有趣的是,如果我將兩個解決方案之一放在queryY()上作為注解,那么我發現下面的兩個解決方案都可行(沒有異常,應用程序也可以)。

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

我閱讀了與該注釋有關的官方文檔: http ://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

REQUIRES_NEW有效是有道理的。 但是我不明白為什么NOT_SUPPORTED也能正常工作。 顯然,我們需要另一個事務來調用queryY()來完成查詢。 並且在NOT_SUPPORTED的說明中,沒有提到它將在掛起第一個事務后開始新事務。

所以我的第一個問題是,為什么NOT_SUPPORTED起作用? 我的第二個問題是,為什么EJB容器認為事務1已結束並且需要在T時間提交,而不是將queryY視為事務1的一部分?

提前致謝! 任何幫助將不勝感激!

這與事務傳播無關。 您應該只使用一個事務來保存所有對象。

您得到的此錯誤:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: A.b -> B.

是因為您嘗試保存A,而A和B之間沒有級聯。

如果A是父母,而B是孩子(具有FK),則將持久性/合並操作從A層疊到B是有意義的。 否則,如果B是父@OneToOne關聯,則需要先保存該關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM