2012-11-02 49 views
1

我有一個包含當前頁面實體對象列表的managedbean。在創建一個新對象並在事務中使用persist()將其持久化到db之後;在另一個事務中,當我調用合併時(因爲實體由於之前的事務提交而處於分離狀態); entitymanager無法在持久化上下文中找到該對象,並向數據庫拋出選擇查詢。我錯過了什麼或者是正常的行爲?hibernate在持久保留後不會將實體添加到persistencecontext

更新:當我使用mysql數據庫和自動生成的Id列時存在上述問題。當我使用甲骨文的時候,我不使用序列來存儲ID;但仍然;持久化上下文應該知道生成的ID;還有什麼方法可以窺視持久性上下文以查看實體退出的情況;我正在使用休眠btw

回答

0

這是正常的行爲。默認情況下,持久性上下文具有相同的事務生命週期。這是完全正常的:一旦事務被提交,其他事務可能會修改實體,並且Hibernate必須從數據庫重新加載實體以確保它不返回陳舊值。

+0

但我打電話合併;爲什麼不能在不查詢數據庫的情況下合併? – x0r

+0

由於合併意味着:將傳遞的分離實體的狀態複製到從數據庫檢索到的附加實體。由於你在另一個事務中,緩存是空的,它需要從數據庫加載實體。 –

+0

對不起,我對這個環境很陌生--Hibernate JPA-所以我沒有你所見的堅實的知識;但是,沒有額外的select語句,相同的體系結構就可以運行一個Oracle。我認爲這與自動生成的ID有關;但我不知道爲什麼。我去做。 – x0r

0

這是正常行爲..如果實例不在持久化上下文中,它需要知道它是否存在(應該被覆蓋或稍後新創建)。

ID生成:生成的ID通常在調用persist(..)時返回,這非常方便,因此您的應用程序可以立即使用新創建的ID,無需等待事務結束。

您可以檢查一個給定的對象是在持久化上下文致電: https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#contains%28java.lang.Object%29

+0

我不明白它是如何相關的;當我堅持;它應該添加到persistenceContext,我應該沒有選擇查詢合併;我錯了嗎? – x0r

相關問題