2009-06-04 113 views
10

因为调用flush()可以让每个实体从内存持久存储到数据库。因此,如果我使用调用太多不必要的flush(),可能需要很长时间,因此不是性能的好选择。这是一个我不知道何时调用flush()的场景?在这种情况下是否需要调用flush()(JPA接口)?

//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

我首先要构建结构,之后坚持的一切。

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描述的方式来连接对象。

+0

谢谢Salandur!是的,我认为我可以在瞬态状态下构建对象并坚持父对象(如果在映射文件中,子对象集合被设置为级联)。最后我可以做flush()。 – 2009-06-05 16:28:52

3

我认为你应该在事务环境中完成所有这些工作,并让它为你处理这些问题。

你需要嵌入到物体的双向关系:

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; 
    } 
} 
+0

谢谢,你是对的!而您嵌入的双向关系可以使我的代码现在变得清晰! – 2009-06-05 16:25:03

相关问题