2016-08-12 1 views
0

OneToMany 관계 설정에 문제가 있습니다.최대 절전 모드 OneToMany, 자연 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) 

그리고 자바 클래스는

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

public class Child { 
    Long refid; 
    String name; 
} 

내 문제는 내가이 클래스에 대한 적절한 매핑을 개발할 수 없다는 것입니다. 일관성있는 이유 때문에 hbm xml을 사용해야합니다. 두 개의 별도 엔티티로 매핑 할 수있었습니다. 그에

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) 

어떤 생각 :

<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> 

나는 예외가?

답변

1

하위 엔티티에 복잡한 키가 있으므로 상위 엔티티에 외래 키를 복잡한 것으로 지정해야합니다.

1

최대 절전 모드 구성 XML 파일의 java 클래스 필드에 따라 등록 정보 이름을 변경하십시오. 자바 클래스에 "채널"필드가있는 경우 컴포지트 기본 키의 일부이지만 hbm 구성에서 "채널"로 이름을 지정해야합니다. 또한

<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가 아님)

관련 문제