2013-04-16 28 views
0

這裏有一個簡單的One-to-Many關係:OrderItems。一個訂單可以包含多個項目。並且有一個關聯表的兩個實體之間ORDERITEMSMAPPING,下面的關係是建立在Order.java:合併方法不會使LAZY提取映射可用

@OneToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "ORDERITEMSMAPPING", 
      joinColumns = @JoinColumn(name = "ORDER_ID"), 
      inverseJoinColumns = @JoinColumn(name = "ITEM_ID")) 
@OrderBy("typeId, shortName") 
@JsonIgnore 
private List<Item> Items; 

之所以作出上述映射爲FetchType.LAZY是數據負載是巨大的Eager映射

然而,從Java EE方面來說,我們需要使用Order的getItems()方法調用getter來查找來自特定一個訂單的所有項目,但是在一個事務中。

這裏是爲了實體的工作:

public List<Item> getItems(Order order){ 
    if(this.items==null){ 
     List<Item> items= new ArrayList<Item>(); 
     EntityManager em = Order.entityManager(); 
     Order merged = em.merge(order); 
     items = merged.getItems(); 
     em.close(); 
     return items; 
    }else{ 
     return this.items; 
    } 
} 

然而,上述方法是不行的,還是回到null項目甚至稱

merged.getOrders();

我買了merge()方法可以返回實體的託管副本,並使LAZY映射可用,但它似乎不正確。

順便說一句我使用OpenJPA,但似乎JPA供應商不是我想問題。在實體管理週期方面,我可能還沒有很深入。請幫忙。謝謝。

+0

如果要合併的訂單上的集合爲空,合併它不會解決問題。它不應該爲空,而是在分離時不可訪問 - 某些提供程序在上下文丟失時會引發異常,而其他提供程序可能會允許它。但是null表示集合沒有價值。嘗試使用em.refresh(訂購),然後訪問集合,如果您確定集合中有數據。 – Chris

回答

0

你屏蔽範圍從成員變量在這一行:

List<Item> items= new ArrayList<Item>(); 

通過聲明List<Item> items,你讓items變量指向堆棧爲if {塊的整體上的對象,而不是像你打算的那樣,this.items

嘗試this.items = new ArrayList<Item>();return this.items

在代碼中使用成員變量的命名約定來避免發生這種情況也是一個好主意。命名變量m_items可以走很長的路。

+0

也被忽略。我認爲這是完整的列表,這意味着要返回或用於填充項目列表 – Chris

+0

@Chris是的,這是一個錯字。剛剛更新..謝謝。 – Dreamer

相關問題