gpt4 book ai didi

hibernate - JPA 和 hibernate : one to one mapping causes three select queries

转载 作者:行者123 更新时间:2023-12-03 14:08:11 25 4
gpt4 key购买 nike

JPA 2.0
hibernate 4.3.5

你好,

以下是我的 OneToOne 映射(示例代码假设 1 个客户只能有 1 个订单)

class Customer {
private Order order;
@OneToOne(mappedBy="customer", fetch=FetchType.LAZY)
public Order getOrder() { return order; }
public void setOrder(Order order) { this.order = order ; }
}

class Order {
private Customer customer;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cust_id")
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
}

//Calling code
Order order = em.find(Order.class, 4); // Line 1
System.out.println(order.getCustomer()); // Line 2
</code>

上面的调用代码实际上产生了 3 个选择语句,即

第 1 行导致
   select * from order where id = ?      #1

第 2 行导致以下两个语句
   select * from customer where id = ?   #2
select * from order where cust_id = ? #3

我的问题:
考虑到两端都启用了 LAZY 提取,难道不应该只有两个查询(即 #1 和 #2)?

谢谢,
拉克什

最佳答案

您已将这两种关系定义为 LAZY。

当您加载 Order 时,将不会加载 Customer 属性,因为它是 LAZY。一个 LAZY 属性只会在它被访问或你定义它被急切加载时加载。

默认情况下,每个以一个(OneToOne 或 ManyToOne)完成的映射都将是热切的,但您将其设置为 LAZY。

尝试将你们的关系定义为 EAGER:

@OneToOne(fetch=FetchType.EAGER) // or just @OneToOne
@JoinColumn(name="cust_id")
public Customer getCustomer() { return customer; }

顺便说一句,您的客户只能有一个订单? O.o

关于hibernate - JPA 和 hibernate : one to one mapping causes three select queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25353786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com