2017-10-28 169 views
1

我有一些實體和延遲加載的引用。在em.close()之後,延遲加載的實體會發生什麼?

EntityA { 

@ManyToMany 
private List<EntityB> bs; 

} 

EntityB { 

@ManyToMany 
private List<EntityA> as; 

} 

我想知道,如果它是保存,如果他們已經加載的PC裏面前訪問持久化上下文(PC)外面那些慵懶的集合? E.g.

// put into PC 
a = em.merge(a); 
// trigger lazy loading 
a.bs.size(); 
em.close(); 
// access outside PC 
a.bs.size(); 

我做了一個EclipseLink的小測試,這似乎工作。但我不知道這是因爲:

  1. 懶惰 - 列出使用弱引用存儲和可訪問的,但現在可能是GCed在某些時候,
  2. 的懶列表是從數據庫中取出即使該實體不在PC中(無論出於何種原因),
  3. 即使數據庫將被關閉,lazy-Lists也會隨時啓動並訪問。

回答

3

即使EM關閉,EclipseLink也會在EMF打開時保持與數據存儲的連接,所以仍然可以加載惰性字段,直到關閉EMF。這可以說是違反JPA規範,許多人認爲它是反模式。

其他JPA提供商將像這樣做,所以,如果你想成爲100%JPA符合標準,你不應該依賴於它,並確保你EM收盤前加載懶領域。如果一個字段沒有被EM關閉加載,那麼訪問它可能會拋出異常(取決於JPA提供者)。

+0

這可能聽起來很愚蠢,但是一旦初始化它就像'任何其他'的集合,對吧?背景中沒有弱引用,代理或任何其他「魔術」? – kerner1000

+0

不知道。我不使用EclipseLink。爲什麼不嘗試,並打印出收集字段的類? – DN1

+0

是的,一旦獲取,實體中就像其他任何參考一樣。只有在沒有獲取上下文的情況下才需要上下文 – Chris