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は、Orderオブジェクト全体ではなく、挿入用のIDのみを必要とするため、明らかにこれは可能です。

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

私はあなたがそうすることができないと思います、あなたがそれにアイテムを加えることができる前に、Hibernateはセッション/コンテキストで注文を持っている必要があるでしょう。つまり、Hibernateはアイテムの順序を「知る」必要があります。

于 2012-06-18T08:55:49.657 に答える
1

「幸いなことに」カスケードポリシーはなく、依存関係はアイテム側に設定されています。

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 に答える
0

Itemこれを行うには、を使用せずに新しいものを作成し、Orderそれを永続化してから、ネイティブクエリを使用しorder_idて新しいものから値を更新します。Item

于 2012-06-18T09:04:01.093 に答える