10

すべてのエンティティを取得するためにflush()を呼び出すと、メモリからデータベースに永続化されるためです。したがって、不必要なflush()の呼び出しを使用しすぎると、時間がかかる可能性があるため、パフォーマンスに適していません。これは、flush()をいつ呼び出すべきかわからないシナリオです。

//Order and Item have Bidirectional Relationships
Order ord = New ord("my first order");
Item item = New Item("tv",10);

//...process item and ord object

em.persist(ord);//em is an instance of EntityManager
em.flush();// No.1 flush()

item.setOrder(ord);
em.persist(item);

Set<Item> items= new HashSet<Item>();
items.add(item);
ord.setItems(items);

em.flush();// No.2 flush()

私の質問は、No.1フラッシュの呼び出しを回避できるかどうかということです。

私が心配しているのは、item.setOrder(ord)を実行するために、ordのデータベースIDが必要です。また、 em.persist(ord)のみを呼び出すとデータベースIDを生成できないため、item.setOrder(ord)の前にem.flush ()を呼び出す必要があります。それで、あなたの意見はどうですか?

前もって感謝します。

4

2 に答える 2

4

これらすべてをトランザクションのコンテキストで実行し、これらの問題を処理できるようにする必要があると思います。

オブジェクトに双方向の関係を埋め込む必要があります。

class Parent
{
    private List<Child> children;

    public boolean addChild(Child c)
    {
        c.setParent(this); // this is the key piece

        return this.children.add(c);
    }
}

class Child
{
   private Parent parent;

   public void setParent(Parent p)
   {
      this.parent = p;
   }
}
于 2009-06-04T09:59:23.523 に答える
4

最初に構造を構築し、その後すべてを永続化する必要があります。

Order ord = New ord("my first order");
Item item = New Item("tv",10);

item.setOrder(ord);

Set<Item> items= new HashSet<Item>();
items.add(item);
ord.setItems(items);

em.persist(ord);

このようにして、ツリー全体を1回の呼び出しで永続化し、フラッシュする必要はありません。

優れたオブジェクトデザインでは、duffymoが説明した方法を使用してオブジェクトを配線する必要があります。

于 2009-06-04T10:43:25.010 に答える