2014-09-04 4 views
1

나는 Hibernate Documentation을 따르고 섹션 9.4. Components as composite identifiers에 주어진 예제를 구현하려고하지만 구현 방법에 관한 문제에 직면하고있다.최대 절전 모드의 복합 식별자로서의 컴퍼넌트

내 엔티티 클래스 :

Order.java

public class Order { 
    private int id; 
    private Set<OrderLine> lines = new HashSet<OrderLine>(); 
    // Setters & Getters 
} 

OrderLine.java

public class OrderLine { 
    private OrderLineId id; 
    private String name; 
    private Order order; 
    // Setters & Getters 
} 

OrderLineId.java

을 여기

내가 한 일이다
public class OrderLineId implements Serializable{ 
    private int lineId; 
    private int orderId; 
    private int customerId; 
    // Setters & Getters 
} 

내 매핑 파일 데 문제 :

내가 말하는 예외 얻고,이 매핑 ​​파일을 구문 분석 세션 공장을 만들려고하고
<hibernate-mapping> 
    <class name="Order" table="TEST_Order"> 
     <id name="id" type="int" column="id"> 
     <generator class="native"/> 
     </id> 
     <set name="lines" cascade="all"> 
     <key column="orderId"/> 
     <one-to-many class="OrderLine"/> 
     </set> 
    </class> 

<class name="OrderLine" table="TEST_OrderLine"> 
    <composite-id name="id" class="OrderLineId"> 
     <key-property name="lineId"/> 
     <key-property name="orderId"/> 
     <key-property name="customerId"/> 
    </composite-id> 

    <property name="name"/> 

    <many-to-one name="order" class="Order" 
      insert="false" update="false"> 
     <column name="orderId"/> 
     <column name="customerId"/> 
    </many-to-one> 
</class> 
</hibernate-mapping> 

:

Caused by: org.hibernate.MappingException: Foreign key (FK_89b4nqt5l2n6tfd1d5tq0ill0:TEST_OrderLine [orderId,customerId])) must have same number of columns as the referenced primary key (TEST_Order [id]) 
    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:1816) 
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1739) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 

수를 누군가가 설명서에 나와있는 예제를 구현하는 방법을 알려주십시오.

답변

2

을 참조.

그것은이 (가) 대일이어야 의미

<many-to-one name="order" class="Order" 
     insert="false" update="false"> 
    <column name="orderId"/> 
</many-to-one> 

orderid를가 Order.id에 FK이다.

나서 일대 측해질 것이다 :

OrderLine에 복합 키를 갖도록해도
<set name="lines" cascade="all"> 
    <key> 
     <column name="orderId"/> 
    </key> 
    <one-to-many class="OrderLine"/> 
</set> 

기준은 단순한 열쇠 Order.id 후에 이루어진다.

OrderLineProduct와 같은 다른 연결을 OrderLine에 매핑하려면 compositeLock을 사용하여 부모 (OrderLine)와 자식 (OrderLineProduct) 간의 연결을 매핑해야합니다. 그러면 OrderLineProduct에 복합 -foreign-Key를 OrderLine으로 되돌립니다.

+0

안녕하세요 블라드, 고마워요 응답에 대한. 귀하의 제안에 따라 hbm 파일을 변경했지만 여전히 동일한 예외가 발생합니다. – Chaitanya

+0

업데이트 된 답변을 확인하십시오.그 복합 키에 대해 혼란 스러웠지만 one-Order-Many-OrderLine 연관에는 간단한 키 (Order.id) 만 있으면됩니다. –

+0

답변에 이어 내 문제가 해결되었습니다. 귀하의 설명을 기반으로 지금 내 질문에 언급 된 동일한 매핑 파일을 가지고 시도하고 내 '주문'엔티티에 대한 합성 ID를 만들었고 문제가없는 지금도 문제를 해결했습니다. 블라드에게 고마워. – Chaitanya

0

두 표 hbm 매핑 모두 동일한 번호를 가져야합니다. TEST_Oder에이 3 개의 열을 추가해야합니다.
예 따를 :

<many-to-one name="orderLine" class="OrderLine"> 
<column name="lineId"/> 
<column name="orderId"/> 
<column name="customerId"/> 
</many-to-one> 

는 OrderLine에 복합 키없는 주문 PK를 refernece 필요 동일한 URL

+0

이제 예외가 발생했습니다 : org.hibernate.MappingException : 외래 키 (FK_d3m49ikqc9585v3uro8r58a8q ​​: TEST_OrderLine [lineId, orderId, customerId]))는 참조 된 기본 키 (TEST_Order [id])' – Chaitanya

+0

@Chaitanya는 열 매핑에 대해서만 문제가 있습니다. 구성 문제가 있기 때문에 더 자세히 알아야합니다. – Rudra

+0

네, 그게 내가 알아낼 수 없었어요 그리고 도움을 구하는거야 – Chaitanya