合并方法不会使LAZY提取映射可用

时间:2013-04-16 18:11:42

标签: java spring java-ee jpa ejb

这是一个简单的One-to-Many关系:OrderItems。一个订单可以包含许多商品。并且在两个实体之间存在关联表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供应商似乎不是问题。可能我对实体管理周期仍然不是很深刻。请帮忙。感谢。

1 个答案:

答案 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可以有很长的路要走。