我正在关注Hibernate关于bidirectional one-to-one relationship的文档,并在Person
和Address
实体之间创建了一对一映射。为什么LEFT OUTER Join需要一对一双向关联
的映射是像在文件中给出的一个:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<one-to-one name="person"
property-ref="address"/>
</class>
现在我创建小号smll程序来获取Person
和相应Address
这样的:
List<Person> persons = session.createQuery("from Person where id=2").list();
for (Person person : persons) {
System.out.println(person);
System.out.println(person.getAddress());
System.out.println(person.getAddress().getPerson());
}
对于线person.getAddress()
,休眠问题LEFT OUTER JOIN
查询为:
select
address0_.addressId as addressId1_0_0_,
person1_.personId as personId1_1_1_,
person1_.addressId as addressId3_1_1_
from
ADDRESS address0_
left outer join
PERSON person1_
on address0_.addressId=person1_.addressId
where
address0_.addressId=?
如果在这种情况下inner join
就足够了,那么为什么hibernate使用left outer join
?请澄清。
出于同样的原因,您在前面的问题:http://stackoverflow.com/questions/25756361/understanding-the-queries-generated-for-one-to-many-and-many-to-one-on -join-TABL。 Hibernate正在通过ID加载一个地址,并且必须知道该地址是否有人。 – 2014-09-11 05:56:50
@JBNizet,感谢您回复我的帖子。但是,在这两种情况下,内部连接看起来与获取其他实体数据而不是左外部连接相关,那么为什么hibernate更喜欢后者呢?你能帮我理解这一点吗? – user3181365 2014-09-11 07:01:32
为什么内部连接会相关? Hibernate如何确保每个地址都有一个人?你已经指定每个人都有一个地址。这并不意味着每个地址都有一个人。 – 2014-09-11 07:51:36