这是一个简单的One-to-Many
关系:Order
到Items
。一个订单可以包含许多商品。并且在两个实体之间存在关联表ORDERITEMSMAPPING
,在Order.java中建立了以下关系:
@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 :(得分:0)
您在此行屏蔽了范围内的成员变量:
List<Item> items= new ArrayList<Item>();
通过声明List<Item> items
,您可以使items
变量指向堆栈中的对象,而不是您想要的if {
块,而不是this.items
。
请尝试this.items = new ArrayList<Item>();
和return this.items
。
在代码中使用成员变量的命名约定也是一个好主意,以避免出现这种情况。命名变量m_items
可以有很长的路要走。