首页 文章

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

提问于
浏览
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()

My question is: calling of the No.1 flush could be avoid or not?

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

提前致谢 .

2 回答

  • 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方式来连接对象 .

  • 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;
       }
    }
    

相关问题