JPA 急切获取未加入
JPA的抓取策略究竟控制着什么?我看不出急切和懒惰之间有什么区别。在这两种情况下,JPA/休眠都不会自动加入多对一关系。
示例:人员只有一个地址。一个地址可以属于许多人。JPA 注释的实体类如下所示:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
如果我使用 JPA 查询:
select p from Person p where ...
JPA/Hibernate 生成一个 SQL 查询以从 Person 表中进行选择,然后为每个人生成一个不同的地址查询:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
这对于大型结果集非常不利。如果有 1000 人,则会生成 1001 个查询(1 个来自 Person,1000 个与 Address 不同)。我知道这一点,因为我正在查看MySQL的查询日志。我的理解是,将地址的提取类型设置为 eager 将导致 JPA/Hibernate 自动查询连接。但是,无论提取类型如何,它仍然会为关系生成不同的查询。
只有当我明确告诉它加入时,它才真正加入:
select p, a from Person p left join p.address a where ...
我在这里错过了什么吗?我现在必须为每个查询手动编写代码,以便它左连接多对一关系。我正在将Hibernate的JPA实现与MySQL一起使用。
编辑:它似乎(请参阅此处和此处的休眠常见问题解答)不会影响 JPA 查询。因此,就我而言,我已经明确告诉它加入。FetchType