实现@OneToMany延迟抓取子的首选方法

时间:2013-03-06 06:32:14

标签: hibernate jpa

我是JPA的新手,并使用Hibernate和Spring创建了一个示例应用程序。从各种帖子和谷歌我发现很少有方法来实现LAZY fetch。

  • 最常讨论的一种方法似乎open session in view pattern,尽管许多人提出了这种方法的各种缺点。
  • 另一种方法是使用Join Query(例如select p from Partner p join fetch p.contacts where...)。

请解释我可能选择的首选实施方式。 感谢。

1 个答案:

答案 0 :(得分:2)

好方法是第二种方式。

在视图模式中打开会话是一种反模式练习。它提供了在JSP / Servlet级别更改实体的机会。这对数据来说并不安全,而且是一种糟糕的编程习惯。

要求的方法是在使用实体之前手动加载实体的延迟加载字段,或者在HQL语句中使用 获取 保留字。您将在视图层中使用哪些/哪些数据是您应该事先知道的事情,因此在使用之前准备/加载数据的责任是您的,这是常识性的事情。

以下是一些提前加载延迟加载字段的方法:

  1. 设置提取模式以在查询时急切地获取字段值

    Criteria.setFetchMode(String associationPath,FetchMode mode);

  2. Hibernate.initialize()方法初始化代理字段。

  3. 在HQL语句中添加 fetch

    从员工中选择emp作为emp取件加入emp.dept作为dept.name如'HR'