当前位置: 代码迷 >> java >> 正确使用Entity和DTO以在Restful Web服务中提供Json
  详细解决方案

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

热度:71   发布时间:2023-07-31 12:08:41.0

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

在视图模式中使用open会话,或者在规范的汇编阶段使用,以避免出现未获取数据的问题.Hibernate使开发人员免于编写繁琐的数据传输对象(DTO)......以上行来自

在SO成员Bohzo的 ,我很少需要阅读DTO

甚至在反对暴露实体的中声明当实体没有任何行为时(当它们是POJO时)不需要具有DTO,如在贫血域模型中那样

假设有一个Entity类

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

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

 class Employee{
    List<Account> accounts

有一个getDepartment()方法,由restful服务用来提供Department的Json信息。

可能的解决方案是

解决方案1)根据hibernate文档打开和关闭每个请求的hibernate会话(这是控制器中最重要的方法是事务性的?)或者更好地使用Spring的按照这个

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

解决方案2)同样在hibernate doc中,另一种方法是进行汇编阶段。它究竟意味着什么? 将getDepartment API分解为DAO的不同API?

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

解决方案4)正如bohzo的文章中的分页视图一样,避免了延迟加载并且有查询来获取有限的结果

请更正解决方案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)。

  相关解决方案