gpt4 book ai didi

java - 正确使用 Entity 和 DTO 以在 Restful Web 服务中提供 Json

转载 作者:搜寻专家 更新时间:2023-11-01 03:03:04 25 4
gpt4 key购买 nike

有很多文章指出在 JPA/hibernate 中不需要使用 DTO

使用 View 模式中的打开 session 或严格的组装阶段来避免未获取数据的问题。Hibernate 使开发人员免于编写繁琐的数据传输对象 (DTO)...以上几行来自https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/best-practices.html

也在article由 SO 成员 Bohzo 我读到很少需要 DTO

即使在 articles反对公开实体声明当实体没有任何行为时(当它们是 POJO 时)不需要 DTO,就像在贫血域模型中一样

假设有一个实体类

class Department{
List<Employee> employees //lazily loaded collection

集合中的每个对象都包含另一个延迟加载的集合

 class Employee{
List<Account> accounts

有一个 getDepartment() 方法用于restful服务提供部门的Json信息。

可能的解决方案是

解决方案 1) 根据 hibernate 文档,根据请求打开和关闭 hibernate session ( Controller 中最上面的方法是事务性的?)或更好地使用 Spring 的 OpenSessionInViewFilter按照这个SO post

为什么 hibernate 不能重新打开 session 并获取延迟加载的对象而不是抛出异常?有没有办法用 JPA/hibernate 配置它?

解决方案 2) 同样在 hibernate 文档中,另一种方法是有一个装配阶段。它到底是什么意思?将 getDepartment API 分解为 DAO 的不同 API?

解决方案 3)使用 DTO 即使使用 DTO,持久层如何知道 View 是否需要完全加载的部门。这导致将 API 分解为 getDepartmentOnly() getDepartmentWithEmployees() 和其他人说是获取 100% 的部门对象还是部分对象一个 API 分解为多个,一个实体映射到多个 DTO

解决方案 4) 正如在 bohzo 的分页 View 文章中,避免延迟加载并使用查询来获取有限的结果

请更正解决方案 2 并解释 hibernate 文档中的意图?

最佳答案

Hibernate 文档中的汇编阶段意味着:

public Department getDepartmentWithEmployees(Long departmentId) {
Department result = em.find(Department.class, departmentId);
Hibernate.initialize(result.getEmployees());
return result;
}

或者:

public Department getDepartmentWithEmployees(Long departmentId) {
String query = "select d from Department d join fetch d.employees where d.id = :departmentId";
...
}

或者……

基本上,由您来获取必要的数据以在代码可读性和可维护性与性能(不同 API 的数量与获取的数据量)之间取得平衡。

这不是 JPA/Hibernate 特定的问题;您还需要将此与任何其他持久性框架(或直接 JDBC)一起考虑。

关于java - 正确使用 Entity 和 DTO 以在 Restful Web 服务中提供 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31505815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com