3

データベースには、休止状態でモデル化する必要がある多対多 (結合テーブルを使用) の関係があります。

結合テーブルにはマッピング情報以上の情報が含まれているため、データベース内の 3 つのテーブルすべてに POJO クラスがあります。

私の問題は、クラス A がクラス B にカスケードするように指示されるクラス AB (結合テーブル) にカスケードするように指示されるクラス A の save() で発生しますが、外部キー参照を AB に保存するポイントに到達すると、テーブル A は null です。

最終的には、TableA クラスのインスタンスで save() を呼び出して、3 つのテーブルすべてを保存できるようにしたいと考えています。

テーブル ダイアグラム

表 A マッピング

<?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 Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.example.dbtables.TableA" table="Table A">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_a_seq</param>
            </generator>
        </id>
        <natural-id>
        <property name="data1" type="int">
            <column name="DATA1" not-null="true" />
        </property>
        <property name="data2" type="string">
            <column name="DATA2" length="16" not-null="true" />
        </property>
        </natural-id>
        <set name="tableAB" cascade="save-update" table="TableAB" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="Table_AB_ID" not-null="true" />
            </key>
            <one-to-many class="com.example.dbtables.TableAB" />
        </set>
    </class>
</hibernate-mapping>

表 AB マッピング

<?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 Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.example.dbtables.TableAB" table="Table AB">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_ab_seq</param>
            </generator>
        </id>
        <natural-id>
        <many-to-one name="tableA" class="com.example.dbtables.TableA" fetch="select">
            <column name="Table_A_ID" not-null="true" />
        </many-to-one>
        <many-to-one name="tableB" cascade="save-update" class="com.example.dbtables.TableB" fetch="select">
            <column name="Table_B_ID" not-null="true" />
        </many-to-one>
        <property name="data1" type="int">
            <column name="DATA1" not-null="true" />
        </property>
            <property name="data2" type="int">
            <column name="DATA2" not-null="true" />
        </property>
        </natural-id>
    </class>
</hibernate-mapping>

表 B マッピング

<?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 Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.examples.dbtables.TableB" table="Table B">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">table_b_seq</param>
            </generator>
        </id>
        <natural-id>
        <property name="data1" type="string">
            <column name="DATA1" length="16" />
        </property>
        <property name="data2" type="java.lang.Integer">
            <column name="DATA2" />
        </property>
        </natural-id>
        <set name="TableAB" table="Table AB" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="Table_AB_ID" not-null="true" />
            </key>
            <one-to-many class="com.example.dbtables.TableAB" />
        </set>
    </class>
</hibernate-mapping>

ご協力いただきありがとうございます。説明やその他の情報が必要な場合はお知らせください。

編集: 私の問題は、AB から A への参照が正しく入力されていないことでした。この問題は、ご協力いただいた皆様のおかげで解決されました。

4

2 に答える 2

0

問題は、AB -> A 間の後方参照がコードに正しく取り込まれていないことでした。助けてくれたイリヤに感謝します。

于 2012-09-18T16:37:55.747 に答える
0
  A a = new A();
  B b = new B();
  AB ab = new AB();
  ab.setA(a);
  ab.setB(b);
  a.setAB(ab);
  b.setAB(ab);

  save(a);  

この例は機能しませんか? 何か例外がありましたか?
EDIT
この Hibernate doc Chapter 5. Basic O/R Mapping to Chapter 5.1.4.1 を調べてください。Generator
PostgreSQLはID生成タイプをサポートしていません。identityなどの代わりにシーケンス
生成を 使用する

于 2012-09-13T15:13:49.573 に答える