2016-08-12 17 views
0

OneToMany関係の設定に問題があります。Hibernate OneToMany、natural PK

マイDBスキーマ:

TABLE PARENT (
VENDOR, 
CHANNEL, 
CREATEDATE, 
REFID, 
... 
) 
UNIQUE INDEX PK_PARENT (VENDOR, CHANNEL, CREATEDATE, REFID) 

TABLE CHILD (
REFID, 
NAME, 
) 
UNIQUE INDEX PK_CHILD (REFID, NAME) 

とJavaクラス

public class Parent { 
    String vendor; 
    String channel; 
    Date createdate; 
    Long refid; 
    List<Child> childs; 
    ... 
} 

public class Child { 
    Long refid; 
    String name; 
} 

私の問題は、私はこのクラスのための適切なマッピングを開発することができないということです。一貫性のある理由から、私はhbm xmlを使用することを余儀なくされています。私はそれを2つの別個のエンティティとしてマップすることができました。

<hibernate-mapping> 
<class name="Parent" table="PARENT"> 
    <composite-id > 
     <key-property name="vendor" type="string"> 
      <column name="VENDOR" /> 
     </key-property> 
     <key-property name="vendor" type="string"> 
      <column name="CHANNEL" /> 
     </key-property> 
     <key-property name="vendor" type="Date"> 
      <column name="CREATEDATE" /> 
     </key-property> 
     <key-property name="vendor" type="Long"> 
      <column name="REFID" /> 
     </key-property> 
    <composite-id /> 
    <list name="childs" table="CHILD" lazy="true" fetch="select"> 
     <key column="REFID" /> 
     <index column="REFID" /> 
     <one-to-many class="Child" /> 
    </list> 
</class> 

<class name="Child" table="CHILD"> 
    <composite-id > 
     <key-property name="vendor" type="Long"> 
      <column name="REFID" /> 
     </key-property> 
     <key-property name="name" type="string"> 
      <column name="NAME" /> 
     </key-property> 
    <composite-id /> 
</class> 
</hibernate-mapping> 

私は例外を取得:その上

Caused by: org.hibernate.MappingException: Foreign key (FK_9897tr114hxkewktsi9vb92x6:CHILD[REFID])) must have same number of columns as the referenced primary key (PARENT[VENDOR,CHANNEL,CREATEDATE,REFID]) 
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110) 
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93) 
    at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1818) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1741) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930) 

任意の考え?

答えて

1

あなたの子エンティティは複雑なキーを持っているため、親エンティティでは外部キーも複雑に指定する必要があります。

1

ハイバーネーション設定XMLファイルのjavaクラスフィールドに従ってプロパティ名を変更します。あなたのJavaクラスに "channel"フィールドがある場合は、コンポジットの主キーの一部ですが、hbm設定で "channel"という名前にする必要があります。

<class name="Parent" table="PARENT"> 
<composite-id > 
    <key-property name="vendor" type="string"> 
     <column name="VENDOR" /> 
    </key-property> 
    <key-property name="channel" type="string"> 
     <column name="CHANNEL" /> 
    </key-property> 
    <key-property name="createdate" type="Date"> 
     <column name="CREATEDATE" /> 
    </key-property> 
    <key-property name="refid" type="Long"> 
     <column name="REFID" /> 
    </key-property> 
<composite-id /> 
<list name="childs" table="CHILD" lazy="true" fetch="select"> 
    <key column="REFID" /> 
    <index column="REFID" /> 
    <one-to-many class="Child" /> 
</list> 

また、あなたは、マッピングの反対側にあるmanyToOneの関係を定義する必要があります。子クラスにParentインスタンスが正しく存在する可能性があります(IDだけでなく)

関連する問題