JPA手动加载集合

时间:2016-02-01 13:04:27

标签: java hibernate jpa jackson spring-data-jpa

我有一个实体持有一个懒惰加载的集合(@OneToMany)。到现在为止还挺好。如果我加载整个实体对象列表(findAll()),我根本不想加载集合。我没有访问该集合,因此我认为在从REST端点返回之前它不会被加载,但看起来Jackson在将其解析为JSON时会访问它。

目前,我遍历整个实体列表并将集合设置为NULL。这似乎是一种非常糟糕的方式,有没有办法只使用专门准备的@Query手动加载集合,而不是自动加载它(LAZY no EAGER)? @JsonViews是正确的方法还是我应该删除@OneToMany注释(我想我失去了实际加载集合的查询的映射)?还有其他建议吗?

Examplecode

@Entity

@Entity
public class Entity {
  @OneToMany(targetEntity = Child.class)
  private List<Child> children;

}

泽西岛资源

@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Entity> getAllEntities() {
  List<Entity> entities = entityService.findAll();

  entities.forEach(e-> e.setChildren(null));

  return entities ;
}

Repository = JpaRepository,默认findAll()实现。

感谢

2 个答案:

答案 0 :(得分:3)

由于您提到了“建议”,我自己也遇到了同样的问题,并决定在API响应中实现自定义DTO。所以我省略了这些收集字段以及所有其他我不希望json处理器触摸的内容。 我确实实现了一组镜像实际持久化实体的DTO,但可能还有其他一些映射器来完成这项工作

答案 1 :(得分:1)

前几天,我问了一个关于REST API designing model classes的问题。可能有一些信息对您有用。

我没有重复使用相同的模型类来实现持久性和REST API,而是认识到最好的方法是创建不同的模型。在某些情况下,您不希望持久性模型与您在API中使用的模型相同。因此,定义不同的模型是可行的方法。

我选择MapStruct从一个模型映射到另一个模型。