为什么hibernate执行两个查询以急切加载@OneToOne双向关联?
我有实体A有一个B实体,而B有一个带有@OneToOne双向关联的A.
现在,当我找到所有A记录时,hibernate在B上执行左外连接的两个查询,如下所示:
select a.id, a.id_b, a.field1, b.id, b.field1 from A as a, B as b left outer join b ON b.id=a.id_b;
select a.id, a.id_b, a.field1, b.id, b.field1 from A as a, B as b left outer join b ON b.id=a.id_b WHERE b.id=?
首先查询加载A和B字段,这没关系,但为什么要执行第二次查询来重新加载A?
我认为这个查询加载了B中的A内容,但是这个A显然是包含B的A ......所以它已经加载了第一个查询,是不是真的?
- 编辑 -
实体A:
@Entity
public class A implements Serializable{
// id and other ecc ecc
@OneToOne
@JoinColumn(name="id_b")
B b;
}
实体B:
@Entity
public class B implements Serializable{
// id and other ecc ecc
@OneToOne(mappedBy="b")
A a;
}
这就是情况,A上的findAll需要两个查询......为什么?
没有找到相关结果
已邀请:
2 个回复
外镶受继
并且B请注意,由于@PrimaryKeyJoinColumn,您不需要mappedBy属性
让我们测试(你可以测试你想要的)
注意我使用MutableInt字段(由Integer属性封装)而不是Integer,因为Integer是一个不可变类型,A和B共享SAME分配的id 但是如果A和B通过使用其他主键而加入,则应使用@JoinColumn和mappedBy(双向关系,右),如下所示
而B
去测试
通过使用所有者B,您将获得两个select语句它是因为B Table不包含指向表A的任何外键列但是通过使用 “来自A左连接获取a.b,其中a.id =:id” 您将只获得一个select语句,因为A知道如何使用其B_ID外键列检索其连接的B.
亲奋漏
和
类是否正确实现了
和
,这样Hibernate可以告诉
指向的
实例与第一个
的实例相同? 听起来您正在尝试建模双向一对一映射 - 请查看本手册中的部分,以查看完成它的推荐方法。