2011-07-07 101 views
0

我想在數據庫的兩個字段之間建立多對一的關係。我正在使用PostgreSQL數據庫和Hibernate。這些表是ApplicationField和Device。第一個有兩列:AppFieldId和Name。第二個有NodeId,Description和AppFieldId。對於ApplicationField Hibernate映射是:Hibernate中的多對一關係

<?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 05-may-2011 13:21:52 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
<class name="com.cartif.database.ApplicationField" table="APPLICATIONFIELD"> 
    <id name="iAppFieldId" column="applicationfieldid" type="java.lang.Integer"> 
     <generator class="sequence"> 
      <param name="sequence">s_applicationfield</param> 
     </generator> 
    </id> 
    <property column="name" lazy="false" name="name" type="java.lang.String"/> 
    <set name="devices"> 
     <key column="appfieldid" /> 
     <one-to-many column="nodeid" class="com.cartif.zigbee.device.Device"/> 
    </set> 
</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 07-abr-2011 13:29:19 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
<class name="com.cartif.zigbee.device.Device" table="Device"> 
    <id column="nodeid" name="iIdentifier" type="java.lang.Integer"/> 
    <property column="description" generated="never" lazy="false" name="description" type="java.lang.String"/> 
    <set name="appField"> 
     <key column="nodeid"/> 
     <many-to-one column="appfieldid" class="com.cartif.database.ApplicationField"/> 
    </set> 
</class> 
</hibernate-mapping> 

在Java類我有對設備類ApplicationField類和ApplicationField appField一個列表中的設備。然而,當我嘗試創建一個SessionFactory,我獲得像一個例外:

org.xml.sax.SAXParseException: Attribute "column" must be declared for element type "one-to-many". 

我應該怎麼辦表之間的關係?

非常感謝!

回答

2

我猜的關係如下:

一個ApplicationField有許多設備。
一個設備可以引用多個ApplicationField。

如果確實如此,那麼在您的映射中會出現一些錯誤。

替換設備用以下的(在Id列變化)設置:

<set name="devices"> 
     <key column="applicationfieldid" /> 
     <one-to-many class="com.cartif.zigbee.device.Device"/> 
</set> 

更新多到一映射爲:

<many-to-one name="appField" column="applicationfieldid" class="com.cartif.database.ApplicationField"/> 
+0

的關係爲:一個ApplicationField有許多設備。一個設備可以僅引用一個ApplicationField。這就像一個國家有幾個城市,但一個城市只在一個國家。 –

+0

Okey。然後在多對一映射中使用unique = true。因此,只有一個設備可以連接到一個ApplicationField。 – nIKUNJ

+0

好!非常感謝!! –

相關問題