2011-01-19 26 views
3

我意識到JPA不能像我期望的那樣工作,因爲我經常會在會話中結束多個單個實體的實例。Java JPA/Hibernate:如何避免會話中實體的多個實例?

這裏的學習情況:父與@OneToMany

映射在一個單一的方法孩子的集合:

  • 獲取父P 實體
  • 負荷集合的一個實例(包含C1和C2的實例):它包含C1和C2的一個實例
  • 然後找到具有父P具有參數的優化JPA查詢的特定子查詢:Child C = dao.getSpecificChild(P)

這裏我希望C是已經加載的兩個實例之一(C1或C2)。我認爲JPA會在當前會話中檢查已經存在的實例。 但是JPA會加載一個新的C實例(不管這裏是C1還是C2都沒關係)。

讓我最終下的兩個不同的實例

我的問題是:這是預期的行爲? 如果是這樣,我如何在會話中協調我的實體實例?

歡呼

+0

父P&dao.getSpecificChild(P)的實例通過使用相同或不同的實體管理器來獲取 – 2011-01-19 11:04:42

回答

2

我怎麼能 調和我的實體實例在 會議?

如果你想從實體轉移狀態,實體B,你可以做到以下幾點:

entityManager.merge(a); 
entityManager.refresh(b); 
+0

似乎是一個很好的選項,可以將看起來像缺陷行爲的東西修補給我!乾杯 – nodje 2011-01-21 02:40:00

0

我也希望從該查詢返回C的實例是先前一個返回的Cs(假設它與txn相同),因爲它們已經被加入到事務中了,這就是DataNucleus當然會做的事情(因爲它也實現了JDO,這是規範的一部分),這就是L1緩存的作用。