我是 JPA 的新手,我使用 Hibernate 和 Spring 创建了一个示例应用程序。从各种帖子和谷歌中,我发现很少有实现 LAZY fetch 的方法。
- 一种讨论最多的方法似乎是视图模式中的开放会话,尽管许多人提出了这种方法的各种缺点。
- 另一种方法是使用联接查询(例如
select p from Partner p join fetch p.contacts where...
)。
请解释我可能选择的首选实施方式。谢谢。
我是 JPA 的新手,我使用 Hibernate 和 Spring 创建了一个示例应用程序。从各种帖子和谷歌中,我发现很少有实现 LAZY fetch 的方法。
select p from Partner p join fetch p.contacts where...
)。请解释我可能选择的首选实施方式。谢谢。
好的方法是第二种方法。
Open session in view 模式是一种反模式实践。它提供了在 JSP/Servlet 级别更改实体的机会。这对数据不安全,并且是一种糟糕的编程习惯。
首选方法是在使用实体之前手动加载实体的延迟加载字段,或者在 HQL 语句中使用fetch保留字。您将在视图层中使用什么/哪些数据是您自己应该提前知道的事情,因此在使用它们之前准备/加载数据是您的职责,这是常识。
以下是一些提前加载延迟加载字段的方法:
设置fetch模式,查询时急切获取字段值
Criteria.setFetchMode(String associationPath, FetchMode 模式);
Hibernate.initialize()方法来初始化代理字段。
在 HQL 语句中添加fetch 。
从 Employee 中选择 emp 作为 emp 提取加入 emp.dept 作为部门 where dept.name like 'HR'