0

我刚开始使用 Hibernate,我想知道如何在不先加载容器的情况下将新元素插入 oneToMany 关系。

考虑以下示例:

@Entity
@Table(name="orders")
class Order {
    @Id @GeneratedId
    public Long id;
    @OneToMany(mappedBy="order")
    public List<Item> items = new ArrayList<Item>();
}

@Entity
@Table(name="items")
class Item {
    @Id @GeneratedId
    public Long id;
    @ManyToOne
    public Order order;
}

我想在订单中插入一个新项目(我知道订单的 id 并且它是有效的),但我不想先加载订单。显然,这应该是可能的,因为 SQL 只需要插入的 id 而不是整个 Order 对象。

4

4 回答 4

2

您应该能够在 Hibernate 中轻松完成这一切。

Item item - new Item();
Order order = new Order();
order.setId(order_id);
item.setOrder(order);
em.persist(item);

确保在 Item 实体中的 order 属性上正确设置了级联属性。如果不这样做,您最终可能会无意中更改 Order 中的值。

@ManyToOne(cascade=CascadeType.PERSIST) 

应该可以。如果订单尚不存在,它将仅允许从项目方面更改订单。

顺便说一句,您可能想将此关系视为多对多,因为在多个订单上拥有项目是有意义的。

于 2012-06-18T09:54:51.783 回答
1

“幸运的是”您没有任何级联策略,并且依赖项设置在 Item 端。

您可以使用 session.load() 加载具有所需 ID 的用户。load() 方法将返回一个代理,以防在会话中找不到它。当您想设置依赖项而不去 db 获取实体时,这很有用。

它看起来像:

Order order = session.load(Order.class, orderId);  // no DB call
Item item = new Item(); 
item.setOrder(order);
// set other attributes of item
session.save(item);

load() 和 get() 的区别请参考 Hibernate:session.get 和 session.load 的区别

于 2012-06-18T09:59:21.127 回答
1

I don't think you can, Hibernate will need to have the Order in session/context before you can add an item to it. i.e. Hibernate will need to 'know' the items order.

于 2012-06-18T08:55:49.657 回答
0

您可以通过创建一个ItemOrder带.order_idItem

于 2012-06-18T09:04:01.093 回答