2014-09-11 54 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