【问题标题】:Merge method doesn't make LAZY fetch mapping available合并方法不会使 LAZY 获取映射可用
【发布时间】:2013-04-16 18:11:42
【问题描述】:

这是一个简单的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 方面,我们需要调用 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


【解决方案1】:

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

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

通过声明List&lt;Item&gt; items,您可以使items 变量指向整个if { 块的堆栈上的一个对象,而不是您想要的this.items

尝试使用this.items = new ArrayList&lt;Item&gt;();return this.items

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

【讨论】:

  • 也忽略了面额。我认为这是要返回或用于填充项目列表的完整列表
猜你喜欢
  • 2014-11-22
  • 2021-12-23
  • 2018-08-23
  • 1970-01-01
  • 2019-04-17
  • 2014-04-21
  • 2018-06-12
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多