2014-09-11 55 views
1

我正在關注Hibernate關於bidirectional one-to-one relationship的文檔,並在PersonAddress實體之間創建了一對一映射。爲什麼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?請澄清。

+0

出於同樣的原因,您在前面的問題: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

+0

@JBNizet,感謝您回覆我的帖子。但是,在這兩種情況下,內部連接看起來與獲取其他實體數據而不是左外部連接相關,那麼爲什麼hibernate更喜歡後者呢?你能幫我理解這一點嗎? – user3181365 2014-09-11 07:01:32

+0

爲什麼內部連接會相關? Hibernate如何確保每個地址都有一個人?你已經指定每個人都有一個地址。這並不意味着每個地址都有一個人。 – 2014-09-11 07:51:36

回答

2

Hibernate使用它的id(它從PERSON獲得)加載地址。在加載期間,不知道該地址是否有人(它不記得它從哪裏得到該ID)。

如果該地址沒有人,並且它使用內連接,則不會返回結果。 它使用外連接,所以如果沒有人,結果將在該人的列中返回NULL。

這是hibernate想要的,所以它使用外連接。

+0

非常感謝Aexander – user3181365 2014-09-11 13:08:00

+0

可以請您回答我的其他類似帖子 - > http://stackoverflow.com/questions/25800160/why-the-one-to -many雙向映射與 - 加入表用途-內和左鷗 – user3181365 2014-09-15 06:10:52