我有一个实体持有一个懒惰加载的集合(@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()
实现。
感谢
答案 0 :(得分:3)
由于您提到了“建议”,我自己也遇到了同样的问题,并决定在API响应中实现自定义DTO。所以我省略了这些收集字段以及所有其他我不希望json处理器触摸的内容。 我确实实现了一组镜像实际持久化实体的DTO,但可能还有其他一些映射器来完成这项工作
答案 1 :(得分:1)
前几天,我问了一个关于REST API designing model classes的问题。可能有一些信息对您有用。
我没有重复使用相同的模型类来实现持久性和REST API,而是认识到最好的方法是创建不同的模型。在某些情况下,您不希望持久性模型与您在API中使用的模型相同。因此,定义不同的模型是可行的方法。
我选择MapStruct从一个模型映射到另一个模型。