2010-07-15 5 views
0

부모 자식 형식 관계에 문제가 있습니다.
Hibernate docs는 부모로부터 외래 키 값을 얻기 위해 하위 클래스에 "다 대일"관계를 추가한다고 말합니다. 하지만이 관계가 작동하도록하려면 자식 클래스에 부모의 순환 포함을 도입하고 내 serializer를 손상시키는 Invoice 속성을 자식 클래스에 추가해야합니다. 누군가 내가 실수하고있는 부분을 지적 할 수 있습니까? 여기 최대 절전 모드로 부모/자식 관계 문제

내 코드입니다 :

Invoice.java

public class Invoice implements Serializable { 
    private Long id; 
    private Date invDate; 
    private String customer; 
    private Set<InvoiceItem> items; 
    ... getters/setters ... 
} 

InvoiceItem.java

public class InvoiceItem implements Serializable { 
    private Long itemId; 
    private long productId; 
    private int quantity; 
    private double price; 
    private Invoice invoice; //??????? 
    ... getters/setters ... 
} 

Invoice.hbm.xml

<class name="Invoice" table="Invoices"> 
    <id name="id" column="ID" type="long"> 
    <generator class="native" /> 
    </id> 
    <property name="invDate" type="timestamp" /> 
    <property name="customer" type="string" /> 

    <set name="items" inverse="true" cascade="all-delete-orphan"> 
    <key column="invoiceId" /> 
    <one-to-many class="InvoiceItem" /> 
    </set> 
</class> 

InvoiceItem.hbm.xml

<class name="InvoiceItem" table="InvoiceItems"> 
    <id name="itemId" type="long" column="id"> 
    <generator class="native" /> 
    </id> 

    <property name="productId" type="long" /> 
    <property name="quantity" type="int" /> 
    <property name="price" type="double" /> 

<many-to-one name="invoiceId" class="Invoice" not-null="true"/> <!--????????--> 
</class> 

답변

2

inverse = "true"속성을 제거하면 InvoiceItem의 Invoice에 대한 참조가 필요하지 않습니다. Hibernate는 InvoiceItem 테이블에 외래 키를 사용하지 않고 별도의 매핑 테이블을 생성 할 것이다.

InvoiceItem 집합의 inverse 특성을 제거하고 InvoiceItem에서 Invoice 속성을 제거하고 매핑에 해당 many-to-one을 입력하면 원하는 것을 얻을 수 있습니다.

또는 InvoiceItem의 송장 참조를 일시적으로 표시하고 직렬화 중에 값을 채우는 방법 : 송장의 항목 집합을 반복하고 각 항목의 invoice 속성을 소유 송장으로 설정할 수 있습니다.

+0

첫 번째 옵션을 시도했지만 오류가 발생했습니다 : " 'invoiceId'필드에 기본값이 없습니다." (BTW 외래 키 DB에서 notNull 및 nullable을 만들고 싶지 않아요). hibernate docs는 내가 피하려고하는 자식 클래스에 many-to-one 관계를 추가 할 것을 제안한다. – WSK

+0

요소에 Invoice의 아래에 not-null = "true"를 추가한다. – mdma

+0

위대한입니다. 두 접근법 모두 작동합니다. 그들 중 누구도 다른 쪽보다 선호합니까? – WSK

관련 문제