2012-04-12 103 views
4

我正試圖讓一些JPA的東西工作。我有一個表有外鍵到另一個表。當我生成JPA實體時,我得到了這些變量的一對多的偏移量......我還需要做什麼將所有表返回到結果集中?如果我真的叫它。這是我正在嘗試做的一個例子。懶惰vs急於加載JPA

@OneToMany(mappedBy="resourceId") 
private List<DistributionLink> distributionLinkCollection; 

@OneToMany批註坐在漂亮......

我想獲得的所有值回我只是需要調用此表右側調用命名查詢?

qLaunchArr = (QuickLaunch[])emf.createNamedQuery("QuickLaunch.getQuickLaunch").getResultList().toArray(); 

我是否認爲我還會得到帶有所有結果集的DistributionLinks數組? 現在我知道這與Eager Loading vs Lazy loading有關。究竟是什麼,我不確定。我知道延遲加載只加載顯式調用(我認爲)的@oneToMany屬性?我怎樣才能找回所有我需要的藏品。我是否需要遍歷結果集並調用命名查詢以使用命名查詢來獲取所有結果集?

謝謝。

回答

6

當您選擇延遲加載的東西取決於你是否仍然在事務上下文,當你與一個getter獲取你的孩子集合,JPA應自動獲取它。因此,如果數據離開具有獲取父對象的實體管理器的會話Bean,那麼您將無法自動實例化延遲加載的集合。

如果您選擇使用預先抓取策略,該集合的每個實例都將被預實例化,以及將可在任何地方。

一個很好的折衷方案,可以避免限制您的設計決策(但仍允許您利用延遲加載來避免在每次抓取這些記錄時加載不需要的東西)只處理這些集合當你事先知道你需要那個集合時,在你的查詢中堅持:

JOIN FETCH distributionLinks 
+0

可能你可以幫助解決這個問題:http:// stackoverflow。 COM /問題/ 9624725 /無會話或會話,被封閉與 - JPA-2和EJB-3-1 – pWoz 2012-04-13 11:58:54