我正在关注bidirectional one-to-one relationship的Hibernate文档,并在Person
和Address
个实体之间创建了一对一的映射。
映射类似于文档中给出的映射:
<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()
,hibernate会将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
?请澄清。
答案 0 :(得分:4)
Hibernate使用它的id(从PERSON获取)加载地址。在加载过程中,它不确定地址是否有人(它不记得从哪里得到id)。
如果地址没有人,并且使用了内连接,则不会返回任何结果。 它使用外部联接,因此如果没有人,则会在该人的列中返回NULL结果。
这是hibernate想要的,所以它使用外连接。