如何在Hibernate中干净地映射2个一对一关联

时间:2011-05-03 16:12:00

标签: java hibernate

我目前正在尝试使用Hibernate创建两个简单的一对一映射,但不知怎的,它不能像我想要的那样工作。

我的主要类名为MailAccount,其映射如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 26.04.2011 14:49:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping package="test.account">
    <class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">

        <id name="id" column="MAIL_ACCOUNT_ID">
            <generator class="native" />
        </id>

        <one-to-one name="incomingServer" cascade="all" />

        <one-to-one name="outgoingServer" cascade="all" />

    </class>
</hibernate-mapping>

服务器映射文件如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 02.05.2011 12:32:52 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="test.server.MailServer" table="MAILSERVER">

        <id name="id" type="long" access="field">
            <column name="MAIL_SERVER_ID" />
            <generator class="native" />
        </id>

        <one-to-one name="mailAccount" class="test.account.MailAccount" foreign-key="MAIL_SERVER_ID"></one-to-one>

    </class>
</hibernate-mapping>

现在,如果我让Hibernate创建表,我得到的就是我想要的:一个表“MailAccount”,其列为“MAIL_ACCOUNT_ID”,另一个表“MailServer”也带有一个id列。

如果我调用session.save(mailAccountInstance);,Hibernate会正确地将数据保存到表中。

但是一旦我尝试将数据加载到MailAccount实例中,Hibernate只会将“incomingServer”属性加载到新的MailAccount实例中,并且outgoingServer属性为空。

我也不明白Hibernate如何将两个表连接在一起,因为表“MailServer”不会将每个服务器所属的MailAccount的id保存为外键。

我该如何解决这个问题?

提前致谢!

Ps:我对Hibernate很新,所以不要因为明显的错误而打败我: - )

1 个答案:

答案 0 :(得分:2)

我建议您查看Hibernate参考手册中的Association Mappings chapter。对于bidirectional one-to-one mapping,建议在一端使用<one-to-one>,在另一端使用<many-to-one unique="true">