2010-11-19 5 views
1

子がコンポジットキーを持ち、その一部が親のプライマリキーであるHibernateで多対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); 

} 

UPDATE: 間違ったリレーションタイプを使用しました)しかし、今私は別の問題がある:それは、テーブル内の子の行を作成するとき、親が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 

答えて

0

:ログから

(私が正しく理解していれば)、多対1

  1. ははmyChildクラスで宣言されなければなりません。
  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は十分だろう)を持つ必要はありません。

+0

ありがとうございます。私は本当に間違ったマッピングを使用していましたが、これは私の問題を解決しませんでした。 – mranders

0

子マッピングの...には何がありますか?何らかの理由で、parentidカラムにマップされているparentというプロパティを宣言していますか?

+0

おそらく、関係のないコードです。 – Kawu

+0

いいえ、子マッピングの親プロパティは宣言しません。 – mranders

0

子どもが親に多対1のマッピングが必要で、子セットが関係を管理していることをHibernateに知らせるために、親セットマッピングにinverse = trueを設定する必要があります。

+1

私はそれを言っていませんでした。あなたは首です。 –

+0

単方向の関係が必要な場合でも、子に多対1のマッピングが必要ですか?子オブジェクトには親の知識がありません。 – mranders

+0

はい、この場合、子から親(少なくともID)を参照しているためです。 –

関連する問題