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()

我的问题是:是否可以避免跟注一号同花?

我担心的是:为了执行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);

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

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

于 2009-06-04T10:43:25.010 回答