在这种情况下是否需要调用flush()(JPA接口)?

时间:2009-06-04 09:16:23

标签: java hibernate jpa flush entitymanager

因为调用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()

我的问题是:拨打第1号同花顺是否可以避免?

我担心的是:为了执行 item.setOrder(ord),我们需要一个ord的数据库ID。并且仅调用 em.persist(ord)无法生成数据库ID,因此我必须在 item.setOrder(ord)之前调用 em.flush() 。你们有什么看法呢?

提前致谢。

2 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分: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);

通过这种方式,您可以在一次调用中保留整个树,并且不需要刷新。

在良好的对象设计中,您应该使用描述的duffymo方式来连接对象。