2011-09-12 13 views
0

나는 Hibernate에서 주문과 주문 항목을 매핑하려고한다. 주문 항목은 부모 순서를 참조 할 수 없습니다해야합니다Hibernate 부모 - 자식 매핑

public class Order { 
    private long id; 
    private Set<OrderIter> orderItems = new HashSet<OrderItem>(); 

    public long id() { 
     return id; 
    } 

    public void add(OrderItem item) { 
     item.setItemNumber(orderItems.size() + 1); 
     orderItems.add(item); 
    } 

    public Set<OrderItem> orderItems() { 
     return Sets.newHashSet(orderItems); 
    } 
} 


public class OrderItem { 
    private int itemNumber; 

    public int itemNumber() { 
     return itemNumber; 
    } 

    public void setItemNumber(int itemNumber) { 
     this.itemNumber = itemNumber; 
    } 
} 

목적은 다음과 같이 Hibernate는 자동으로이 순서에 추가되는 경우 주문 항목을 유지하는 것입니다 :

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 


Order order = (Order) session.load(Order.class, orderId); 
OrderItem item = new OrderItem(); 
order.add(item); 

// Done 

session.getTransaction().commit(); 
HibernateUtil.getSessionFactory().close(); 

나는 모습을 Chapter 24. Example: Parent/Child에 있지만이 예에서는 하위가 상위에 대한 참조를가집니다.

<class name="Order" table="ORDERS"> 
    <id name="id" column="ORDER_ID" access="field"> 
     <generator class="native" /> 
    </id> 

    <set name="orders" table="ORDER_ITEMS" access="field"> 
     <key column="id" /> 
     <composite-element class="OrderItem"> 
      <property name="ItemNumber" access="field" /> 
     </composite-element> 
    </set> 
</class> 

이 거의 노력하고 있습니다 만, 주문 ID 및 항목 번호의 조합은 고유해야 : ​​지금 Collections of dependent objects을 사용하여지도하기 위해 노력하고있어. Hibernate 매핑으로 이러한 모든 기준을 어떻게 충족시킬 수 있습니까?

+0

Order와 OrderItem 간의 일대 다 연관에 대해 조인 테이블을 사용해보십시오. – frictionlesspulley

+0

@EdSaito : 'item.setItemNumber (orderItems.size() + 1);') 코드를 사용하여 고유성을 얻을 수 없습니다. 여기서는 DB 시퀀스 (또는 자동 증가 된 키)를 시뮬레이트하려고하지만 동일한 항목 수의 주문에 새 항목을 추가 할 때 확실히 실패합니다. DB만이 일관된 방식으로 처리 할 수 ​​있습니다 (두 응용 프로그램이 순서대로 항목 목록을 업데이트하는 상황을 상상해보십시오). 이를 수행하는 유일한 방법은 자동 생성 된 키를 이용하는 것이므로 'OrderItem'은 독립적 인 엔터티 여야합니다 (@frictionlesspulley 응답 참조). –

+0

맞습니다. 그러나 이것은 매핑 문제를 설명하기위한 단순한 시나리오입니다. –

답변

1

여기서 Order-> OrderItem 간의 일대 다 연관은 JOIN TABLE을 사용하여 매핑됩니다. 일대 다 연관은 고유 집합이 true로 설정된 many-to-many로 매핑된다. (일대가 세트에 조인 테이블을 인식하지 않기 때문에)

<class name="Order" table="ORDERS"> 
     <set name="orders" table="ORDER_ORDERITEMS_RT"> 
      <key column="ORDER_ID" /> 
      <many-to-many name="OrderItem" unique="true" column="ORDERITEM_ID"/> 
     </set> 
    </class> 

    <class name="OrderItem table="ORDERITEMS"> 

    </class> 

상기 매핑 만족

  1. OrderItem에이 기준 순서 필요 없다. 맵핑이 별도의 테이블에 있으므로,
  2. 일대 다 연관은 orderid-orderitemid 쌍을 고유하게 만듭니다.
  3. 주문에 목록에 추가 할 때 orderItem을 저장할 수 있도록 세트에 적절한 계단식을 넣을 수 있습니다. (매핑에 표시되지 않음)

희망이 도움이됩니다.

관련 문제