2011-05-03 46 views
0

我目前正在嘗試使用Hibernate創建兩個簡單的一對一映射,但不知何故它不能按我希望的方式工作。如何在休眠中乾淨地映射2個一對一的關聯

我的主要類被稱爲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創建表,我幾乎可以得到我想要的東西:帶有「MAIL_ACCOUNT_ID」列的表「MailAccount」和帶有ID列的另一個表「MailServer」。

如果我打電話session.save(mailAccountInstance);,Hibernate會正確地將數據保存到表中。

但是一旦我嘗試將數據加載到MailAccount實例中,Hibernate只會將「incomingServer」屬性加載到新的MailAccount實例中,並且outgoingServer屬性爲空。

我也不明白Hibernate如何將兩個表連接在一起,因爲表「MailServer」不保存每個服務器所屬的MailAccount的id作爲外鍵。

我該如何解決這個問題?

在此先感謝!

PS:我是很新的休眠,所以不要打我不怎麼出明顯的錯誤:-)

回答

2

我建議採取在Hibernate參考手冊看看Association Mappings chapter。對於bidirectional one-to-one mapping,建議一端使用<one-to-one>,另一端使用<many-to-one unique="true">

+0

設置unique =「true」導致一個異常,因爲重複的條目(在這種情況下是MailAccount id),但通常您的建議有效。用MailServer.hbm.xml文件中的多對一替換一對一映射取得了訣竅!謝謝。 – Timo 2011-05-03 17:18:39