2011-12-16 85 views
5

EntityManager.persist()的文件表示,將。EntityManager.contains()後,堅持返回false()

它將實體持久化到數據庫,但是當我調用EntityManager.contains()方法來檢查我剛剛持久化的實體是否被管理時,它將返回false

我只想知道爲什麼會發生這種情況?也許有些東西是我無法做到的,或者是我忽視的東西?

建議將不勝感激:D

+1

你可以發佈你的代碼,你堅持和讀取EntityManager的內容? – 2011-12-16 11:44:03

回答

3

這真的很奇怪。根據該Sun EJB3 spec

的方法可以被用來確定在當前的持久性上下文的實體 實例是否進行管理。

contains方法返回true:

  • 如果實體已被從數據庫中檢索,並沒有被移除或分離。
  • 如果實體實例是新的,而persist方法被調用的實體或持續操作已經級聯到它。

contains方法返回false:

  • 如果實例分離。
  • 如果在實體上調用了remove方法,或者刪除操作已與級聯。
  • 如果實例是新的,而persist方法還沒有被調用的實體或持續操作尚未級聯 它。

注意的持續級聯的效應或刪除是 立即可見的含有方法,而實際 插入或缺失針對該實體 數據庫表示的可被推遲,直到該事務的結束。

您是否在同一個事務中調用contains

+0

我確實相信我處於同一事務中,但我並不確定,因爲我沒有定義事務應該開始和提交的位置,因爲我將它留給了容器。但我想爲什麼我沒有得到持久實體是因爲主鍵。主鍵之一應該來自數據庫,我無法檢索。無論如何,我只是嘗試一種不同的方法來完成這件事。謝謝你的信息,但:D – 2011-12-16 06:14:53

0

我們做了一些解決方法,而不是持續>刷新,我們只是把從數據庫中自動生成的密鑰並手動將其指定爲實體的鍵字段,然後堅持它。