Hibernate @OneToOne双向导致冗余选择查询

时间:2015-07-29 06:01:09

标签: java hibernate jpa

我有两个实体:地址和客户。它们具有一对一的关系和双向关系。

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(mappedBy = "address", cascade = CascadeType.ALL)
    private Customer customer;

    ...
}

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    private Address address;

    ...
}

然后执行以下代码,按ID选择Customer。

entityManager.find(Customer.class, 1L);

我发现将生成两个查询。这太令人困惑了。我认为只有第一个查询足以同时获得客户和地址实体。

select * from Customer customer0_ left outer join Address address1_ on customer0_.address_id=address1_.id where customer0_.id=?
select * from Customer customer0_ left outer join Address address1_ on customer0_.address_id=address1_.id where customer0_.address_id=?

有没有人遇到这个问题?如果代码中有错误,你能指出我吗?

1 个答案:

答案 0 :(得分:1)

您需要将OneToOne中的至少一个定义为fetch = FetchType.LAZY。默认值为FetchType.EAGER - 这就是他尝试在第二个语句中加载Address.customer的原因。

我不会将cascade = CascadeType.ALL用于两个方向 - 这也可能导致问题。通常只有链接的拥有方会使用CascadeType.ALL