這裏有一個簡單的One-to-Many
關係:Order
到Items
。一個訂單可以包含多個項目。並且有一個關聯表的兩個實體之間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供應商不是我想問題。在實體管理週期方面,我可能還沒有很深入。請幫忙。謝謝。
如果要合併的訂單上的集合爲空,合併它不會解決問題。它不應該爲空,而是在分離時不可訪問 - 某些提供程序在上下文丟失時會引發異常,而其他提供程序可能會允許它。但是null表示集合沒有價值。嘗試使用em.refresh(訂購),然後訪問集合,如果您確定集合中有數據。 – Chris