gpt4 book ai didi

java - JPA 中的附加查询

转载 作者:行者123 更新时间:2023-11-30 04:09:01 25 4
gpt4 key购买 nike

我有两个类 InvitedPersonFlight ,彼此之间具有一对一的关系。以下是它们的注释方式。

public class InvitedTech{
...
@OneToOne(mappedBy="invitedTech", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
public Flight flight;

@OneToOne(mappedBy="invitedTech", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
public Hotel hotel;

...
}

public class Flight{
...
@OneToOne
@JoinColumn(name="invitedTechId", nullable=false)
public InvitedTech invitedTech;
...
}

如您所见,Flight 是关系的所有者,InvitedTech 是此双向关系的另一方。 InvitedTech 与 Hotel 也有 OneToOne 关系。现在,当我编写一个简单的查询来获取所有航类时,它总共触发了三个查询。第一个得到了结果,但引发了 2 个额外的查询。

List<Flight> flg = JPA.em().createQuery("SELECT flg from Flight flg").getResultList();
  1. 获取所有航类的查询(这是我唯一需要的)
  2. 使用 InvitedTech 和 Flight 之间的联接进行查询
  3. 查询 InvitedTech 和 Hotel 之间的连接

即使我设置了 FetchType=Lazy,为什么仍执行查询 2&3。我没有访问酒店信息。并且 Flight 不应再次查询,因为第一个查询返回数据。

经过一番尝试,当我从两个注释中删除 mappedBy 属性时,这两个附加查询不会被执行(即只有第一个查询被执行)。

为什么即使FetchType=LazymappedBy 属性也会导致执行额外的查询。有办法阻止这种情况吗?

最佳答案

我相信这是由于 Hibernate 的特性之一造成的:

非可选的一对一关系都会立即加载,无论它们是否映射为惰性关系。

这背后的原因是,由于引擎无论如何都必须查看关联表 - 以确定是否应该将关联设置为代理或空 - 那么它也可能会加载关联的实体。

我自己也经历过这种情况,据我所知,唯一的解决办法是用Optional=False 来标记关系,这告诉Hibernate 它总是可以设置代理。

如果关系是可选的,那么唯一的其他选项似乎是字节码检测。

另请参阅:

https://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one

Making a OneToOne-relation lazy

关于java - JPA 中的附加查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20074881/

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