我正在關注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