1

次のような(レガシー)テーブル構造があります。

table parent (
  parentid int (PK)
  ...
)

table child (
  parentid int (PK)
  childid int (PK)
  ...
)

つまり、子の主キーの一部が親の主キーになります。これを次のようにマップしようとしました(xmlベースのHibernateを使用しています):

<hibernate-mapping>
<class name="com.example.MyParent" table="parent">

    <id name="parentid" column="parentid" unsaved-value="0" >
        <generator class="identity"/>
    </id>

    <set name="children" cascade="all">
        <key>
            <column name="parentid"/>
        </key>
        <one-to-many class="com.example.MyChild" />
    </set>
...
</class>

<class name="com.example.MyChild" table="child">
    <composite-id name="id" class="com.example.MyChildId">
        <key-property name="parentid" column="parentid" />
        <key-property name="childid" column="childid" />
    </composite-id>
    ...
</class>

Java クラス:

public void updateParent(MyParent param) {
    ht.saveOrUpdate(param);

}

更新: 間違ったリレーション タイプ (更新済み) を使用していましたが、別の問題があります。テーブルに子行を作成するときに、parentid が null のようです。parentid は複合キーの一部であるため、挿入は失敗します。

ログから:

DEBUG SQL - insert into Child(PARENTID, CHILDID) values (?, ?)
TRACE IntegerType - binding null to parameter: 1
TRACE IntegerType - binding '5678' to parameter: 2
WARN  JDBCExceptionReporter - SQL Error: -10, SQLState: 23502
ERROR JDBCExceptionReporter - integrity constraint violation: NOT NULL check constraint;     SYS_CT_10028 table: Child
4

3 に答える 3

0

Tom Andersonが言うように、子から親への多対1のマッピングが必要です。おそらく、子が関係を管理していることを休止状態に知らせるために、親セットのマッピングにinverse=trueを貼り付けます。

于 2010-11-23T13:48:40.477 に答える
0

...子マッピングには何がありますか? ひょっとして、parentid 列にマップされた parent というプロパティを宣言していませんか?

于 2010-11-22T20:30:43.923 に答える
0

ここには2つの問題があると思います:

  1. MyChild クラスで多対 1 を宣言する必要があります (正しく理解していれば)。
  2. 複合キーで @JoinColumn アノテーションを使用する場合、referencedColumnName は必須です。これは XML にも当てはまるのではないでしょうか? http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Primary_Keys_through_OneToOne_and_ManyToOne_Relationshipsを参照してください。

PS: childid が既に識別されている (一意で、null でない) 場合、キーに parentid を含める必要はありません (FK で十分です)。

于 2010-11-22T17:16:13.767 に答える