0

データベースの2つのフィールド間で多対1の関係を確立したいと思います。PostgreSQLデータベースとHibernateを使用しています。テーブルはApplicationFieldとDeviceです。最初の列には、AppFieldIdとNameの2つの列があります。2つ目は、NodeId、Description、およびAppFieldIdを持っています。ApplicationFieldの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クラスにListデバイスがあり、DeviceクラスにApplicationFieldappFieldがあります。ただし、sessionFactoryを作成しようとすると、次のような例外が発生します。

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

テーブル間の関係はどのようにすればよいですか?

どうもありがとう!!

4

1 に答える 1

2

関係は次のとおりだと思います。

1つのApplicationFieldには多くのデバイスがあります。
1つのデバイスが多数のApplicationFieldを参照できます。

それが本当なら、あなたのマッピングにいくつかの間違いがあります。

次のように設定されたデバイスを置き換えます(ID列の変更):

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

多対1のマッピングを次のように更新します。

<many-to-one name="appField" column="applicationfieldid" class="com.cartif.database.ApplicationField"/>
于 2011-07-07T06:49:22.143 に答える