JPA 的获取策略控制到底是什么?我看不出渴望和懒惰之间有什么区别。在这两种情况下,JPA/Hibernate 不会自动加入多对一关系。
示例: Person 只有一个地址。一个地址可以属于许多人。带 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;
}
If I use the JPA query:
select p from Person p where ...
JPA/Hibernate 生成一个要从 Person 表中选择的 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 的查询日志。我的理解是,将地址的获取类型设置为渴望将导致 JPA/Hibernate 使用连接自动进行查询。但是,无论获取类型如何,它仍然为关系生成不同的查询。
只有当我明确地告诉它加入时,它才会真正加入:
select p, a from Person p left join p.address a where ...
我错过了什么吗?现在,我必须手工编写每个查询的代码,以便它能够左连接多对一关系。我在 MySQL 中使用 Hibernate 的 JPA 实现。
编辑: 看起来(参见 Hibernate FAQ 给你和 给你) FetchType
并不影响 JPA 查询。所以在我的例子中,我明确地告诉它加入。