相关疑难解决方法(0)

JPA eager fetch不加入

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;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用JPA查询:

select p from Person p where ...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这对于大型结果集非常糟糕.如果有1000个人,则会生成1001个查询(1个来自Person,1000个来自地址).我知道这是因为我正在查看MySQL的查询日志.我的理解是,将地址的提取类型设置为eager会导致JPA/Hibernate自动使用连接进行查询.但是,无论获取类型如何,它仍会为关系生成不同的查询.

只有当我明确告诉它加入时它才真正加入:

select p, a from Person p left join p.address …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa join

106
推荐指数
6
解决办法
12万
查看次数

标签 统计

hibernate ×1

java ×1

join ×1

jpa ×1