0

这是一个简单的One-to-Many关系:Orderto 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()方法从特定的一个订单中查找所有项目,但是在一个事务中。

这是 Order 实体中的工作:

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即使调用仍然返回项目

合并的.getOrders();

我toughtmerge()方法可以返回实体的托管副本并使LAZY映射可用,但这似乎不是真的。

顺便说一句,我正在使用 OpenJPA,但我猜 JPA 供应商似乎不是问题。可能我对实体管理周期还不是很深入。请帮忙。谢谢。

4

1 回答 1

0

您在这一行屏蔽了作用域中的成员变量:

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

通过声明List<Item> items,您使items变量指向整个if {块的堆栈上的对象,而不是this.items像您想要的那样。

尝试this.items = new ArrayList<Item>();, 而return this.items不是。

在代码中使用成员变量的命名约定也是一个好主意,以避免发生这种情况。命名变量m_items可以走很长的路。

于 2013-04-16T18:17:42.543 回答