我正在尝试在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>
这几乎正常,但订单ID和商品编号的组合应该是唯一的。如何通过Hibernate映射满足所有这些标准?
答案 0 :(得分:1)
这里使用JOIN TABLE映射Order-&gt; OrderItem之间的一对多关联。 一对多关联映射为多对多,唯一设置为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>
上述映射满足
希望这有帮助。