为什么LEFT OUTER需要一对一的双向关联

时间:2014-09-11 05:50:51

标签: java hibernate

我正在关注bidirectional one-to-one relationship的Hibernate文档,并在PersonAddress个实体之间创建了一对一的映射。

映射类似于文档中给出的映射:

<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?请澄清。

1 个答案:

答案 0 :(得分:4)

Hibernate使用它的id(从PERSON获取)加载地址。在加载过程中,它不确定地址是否有人(它不记得从哪里得到id)。

如果地址没有人,并且使用了内连接,则不会返回任何结果。 它使用外部联接,因此如果没有人,则会在该人的列中返回NULL结果。

这是hibernate想要的,所以它使用外连接。