JPA 手动加载集合
JPA manually load collections
我有一个实体持有一个延迟加载的集合 (@OneToMany
)。到目前为止,一切都很好。如果我加载整个实体对象列表 (findAll()
),我根本不想加载集合。我不访问该集合,因此我假设它在从 REST 端点返回之前不会被加载,但似乎 Jackson 在将它解析为 JSON.
时访问了它
目前我遍历整个实体列表并将集合设置为 NULL
。这似乎是一种非常糟糕的做法,有没有办法只使用专门准备的 @Query
手动加载集合而不自动加载它(要么 LAZY no EAGER)? @JsonViews
是正确的方法还是应该删除 @OneToMany
注释(我想我会丢失实际加载集合的查询的映射)?还有其他建议吗?
示例代码
@实体
@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()
实现。
谢谢
自从您提到 'suggestion' 后,我自己也遇到了同样的问题,因此我决定实施要在 API 响应中发送的自定义 DTO。所以我省略了这些集合字段和所有其他我不希望 json 处理器接触的字段。
我确实实现了我的一组 DTO 镜像实际持久实体,但可能有一些其他映射器来完成这项工作
前一段时间,我问了一个关于 designing model classes 的问题,用于 REST API。那里可能有一些对您有用的信息。
我意识到最好的方法是创建不同的模型,而不是为持久性和 REST API 重用相同的模型 类。在某些情况下,您不希望持久性模型与您在 API 中使用的模型相同。因此,定义不同的模型是可行的方法。
我选择 MapStruct 从一个模型映射到另一个模型。
我有一个实体持有一个延迟加载的集合 (@OneToMany
)。到目前为止,一切都很好。如果我加载整个实体对象列表 (findAll()
),我根本不想加载集合。我不访问该集合,因此我假设它在从 REST 端点返回之前不会被加载,但似乎 Jackson 在将它解析为 JSON.
目前我遍历整个实体列表并将集合设置为 NULL
。这似乎是一种非常糟糕的做法,有没有办法只使用专门准备的 @Query
手动加载集合而不自动加载它(要么 LAZY no EAGER)? @JsonViews
是正确的方法还是应该删除 @OneToMany
注释(我想我会丢失实际加载集合的查询的映射)?还有其他建议吗?
示例代码
@实体
@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()
实现。
谢谢
自从您提到 'suggestion' 后,我自己也遇到了同样的问题,因此我决定实施要在 API 响应中发送的自定义 DTO。所以我省略了这些集合字段和所有其他我不希望 json 处理器接触的字段。 我确实实现了我的一组 DTO 镜像实际持久实体,但可能有一些其他映射器来完成这项工作
前一段时间,我问了一个关于 designing model classes 的问题,用于 REST API。那里可能有一些对您有用的信息。
我意识到最好的方法是创建不同的模型,而不是为持久性和 REST API 重用相同的模型 类。在某些情况下,您不希望持久性模型与您在 API 中使用的模型相同。因此,定义不同的模型是可行的方法。
我选择 MapStruct 从一个模型映射到另一个模型。