Hibernate父子映射

时间:2011-09-12 20:39:20

标签: java 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,但在这个例子中,孩子有一个对父母的引用。我现在正尝试使用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映射满足所有这些标准?

1 个答案:

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

上述映射满足

  1. OrderItem没有对Order的引用。由于映射是在一个单独的表中
  2. 一对多关联使orderid-orderitemid对唯一。
  3. 您可以在集合上添加适当的级联,以便在添加到订单列表时保存orderItem。 (未在映射中显示)
  4. 希望这有帮助。