将 FetchType.LAZY 与 JBoss/Wildfly 和 JSON 结合使用

问题描述 投票:0回答:1

在WildFly中,我定义了一个这样的实体:

@Entity
@Table("OrderTable")
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderEntity {
    private List<ItemEntity> items;

    @OneToMany(targetEntity = ItemEntity.class, cascade=CascadeType.ALL)
    @JoinColumn(name="ITEM_ID")
    public List<ItemEntity> getItems() {...}
    public void setItems(List<ItemEntity> items) {...}
} 

然后使用 JaxRS,我定义它来检索数据

    @GET
    @Path("/{id}")
   public Response getOrder(@PathParam("id") String id) {
        OrderEntity order= orderService.retrieveOrder(id);
        return Response.ok(order).build()
   }

我的问题是,虽然 orderService 业务层返回订单实体没有问题,但当我尝试返回映射到 JSON 的 Response.ok() 时,它会抱怨我的项目未加载:“无法延迟初始化集合角色”

这是否意味着我必须加载所有关系才能使这项工作正常进行,即使我不需要访问项目关系?

hibernate jpa jax-rs wildfly
1个回答
0
投票

如果你没有明确说明,JSON 不知道你需要什么。

解决方法:

  1. 如果不需要,请将
    @JsonIgnore
    添加到
    getItems
  2. 添加
    cascade=EAGER
    以加载项目(如果您确实需要它们)。
  3. @Transaction
    添加到
    getOrder
    方法来加载项目(不推荐这种方式,但从技术上讲它有帮助)。
  4. 添加一些中间 DTO 层 - 在这种情况下,您可以针对不同情况为一个实体拥有多个 DTO,根据您的需要,它们将具有一组不同的字段。
  5. 还允许加载不同数据集但无需 DTO 的方式 - JPA 实体图
© www.soinside.com 2019 - 2024. All rights reserved.