我有两个实体:地址和客户。它们具有一对一的关系和双向关系。
@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=?
有没有人遇到这个问题?如果代码中有错误,你能指出我吗?
答案 0 :(得分:1)
您需要将OneToOne
中的至少一个定义为fetch = FetchType.LAZY
。默认值为FetchType.EAGER
- 这就是他尝试在第二个语句中加载Address.customer
的原因。
我不会将cascade = CascadeType.ALL
用于两个方向 - 这也可能导致问题。通常只有链接的拥有方会使用CascadeType.ALL
。