2011-09-12 75 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。 (未在映射中显示)

希望这有助于。