2011-09-12 104 views
0

我試圖在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,但在這個例子中,孩子有一個對父母的引用。現在我想用Collections of dependent objects映射它:

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

這幾乎是工作,但爲了編號和項目數的組合應該是唯一的。我如何通過Hibernate映射滿足所有這些標準?

+0

嘗試使用連接表,在Order和OrderItems之間的一對多關聯中。 – frictionlesspulley

+0

@EdSaito:您無法使用代碼item.setItemNumber(orderItems.size()+ 1);'來實現唯一性。在這裏,您嘗試模擬數據庫序列(或自動增量鍵),但是當您將新項目添加到具有相同數量項目的訂單時,肯定會失敗。只有數據庫可以以一致的方式完成它(想象兩個應用程序按順序更新項目列表的情況)。唯一簡單的方法是自動生成密鑰,所以'OrderItem'應該是一個獨立的實體(請參閱@frictionlesspulley回覆)。 –

+0

你是對的,但這只是一個場景來說明我的映射問題。 –

回答

1

此處Order-> OrderItem之間的一對多關聯使用JOIN TABLE映射。 一對多關聯映射爲多對多且唯一設置爲true。 (因爲一到許多不上組意識到一個連接表的)

<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。 (未在映射中顯示)

希望這有助於。