2011-07-07 57 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

好!非常感谢!! –