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映射滿足所有這些標準?
嘗試使用連接表,在Order和OrderItems之間的一對多關聯中。 – frictionlesspulley
@EdSaito:您無法使用代碼item.setItemNumber(orderItems.size()+ 1);'來實現唯一性。在這裏,您嘗試模擬數據庫序列(或自動增量鍵),但是當您將新項目添加到具有相同數量項目的訂單時,肯定會失敗。只有數據庫可以以一致的方式完成它(想象兩個應用程序按順序更新項目列表的情況)。唯一簡單的方法是自動生成密鑰,所以'OrderItem'應該是一個獨立的實體(請參閱@frictionlesspulley回覆)。 –
你是對的,但這只是一個場景來說明我的映射問題。 –