Hibernate @OneToOne双向关联导致冗余查询

4

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

@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查找客户。
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=?

有人遇到这个问题吗?如果代码有误,请指出来。


你能在Customer类的address上方添加@JoinColumn(name = "foreign_key_in_customer")吗?还有,为什么要使用new Address(); - Naman Gala
你尝试过使用@JoinColumn注释并查看结果吗? - Naman Gala
我猜测在“find”之后还有一些代码,用于创建第二个“SELECT”。通常,“find”只有一个“SELECT”。 - Tobias Liefke
@NamanGala 我已经添加了 JoinColumn,但仍然得到了两个 select。 - Jiaguo Fang
你调试过你的代码吗?在查找时两个选择器都被触发了吗? - Naman Gala
显示剩余2条评论
1个回答

1
你需要至少定义一个 OneToOnefetch = FetchType.LAZY。默认值是 FetchType.EAGER - 这就是为什么它尝试在第二个语句中加载 Address.customer 的原因。
我不会为两个方向都使用 cascade = CascadeType.ALL - 这也可能导致问题。通常只有链接的拥有方会使用 CascadeType.ALL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接