JPA的提取策略究竟控制什么?我无法发现渴望与懒惰之间的任何区别。在这两种情况下,JPA / Hibernate都不会自动加入多对一关系。
示例:人员有一个地址。一个地址可以属于许多人。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个,“地址”中有1000个)。我知道这是因为我正在查看MySQL的查询日志。据我了解,将地址的获取类型设置为热切会导致JPA / Hibernate自动进行联接查询。但是,无论获取类型如何,它仍会生成不同的关系查询。
只有当我明确告诉它加入时,它才真正加入:
select p, a from Person p left join p.address a where ...
我在这里想念什么吗?现在,我必须手动编写每个查询的代码,以使它离开连接多对一关系。我正在将Hibernate的JPA实现与MySQL配合使用。
编辑:看起来(不会在这里和这里看到Hibernate FAQ )FetchType
不会影响JPA查询。因此,就我而言,我已明确告诉它要加入。