2012-04-12 107 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