【发布时间】:2013-04-16 18:11:42
【问题描述】:
这是一个简单的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 方面,我们需要调用 getter 以使用 Order 的 getItems() 方法从特定订单中查找所有商品,但在一个事务中。
这是订单实体中的工作:
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 items
merged.getOrders();
我认为merge() 方法可以返回实体的托管副本并使LAZY 映射可用,但这似乎不正确。
顺便说一句,我正在使用 OpenJPA,但我想 JPA 供应商似乎不是问题。可能我对实体管理周期还不是很深入。请帮忙。谢谢。
【问题讨论】:
-
如果集合在被合并的订单上为空,合并它不会解决问题。它不应该为空,而是在分离时无法访问 - 一些提供者在上下文丢失时抛出异常,而其他提供者可能允许它。但是 null 意味着集合没有价值。如果您确定集合中有数据,请尝试使用 em.refresh(order) 并访问该集合。
标签: java spring jakarta-ee jpa ejb