2009-06-04 132 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

相關問題