有很多文章指出使用JPA / hibernate
不需要使用DTO在视图模式中使用open会话,或者使用规范的程序集阶段来避免未获取数据的问题.Hibernate使开发人员免于编写繁琐的数据传输对象(DTO)... 以上行来自https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/best-practices.html
同样在SO {00}成员的article中我很少需要阅读DTO
即使在articles中反对暴露实体也表示当实体没有任何行为时(当它们是POJO时)不需要DTO,如贫血域模型中那样
假设有一个实体类
class Department{
List<Employee> employees //lazily loaded collection
集合中的每个对象都包含另一个延迟加载的集合
class Employee{
List<Account> accounts
有一个getDepartment()方法 这是一个宁静的服务用来提供部门的Json信息。
可能的解决方案是
解决方案1)根据hibernate文档打开和关闭每个请求的hibernate会话(这是控制器中最重要的方法是事务性的?)或更好的使用Spring OpenSessionInViewFilter按照SO post
为什么不能重新打开会话并获取延迟加载的对象而不是抛出异常?有没有办法用JPA / hibernate配置它?
解决方案2)同样在hibernate doc中,另一种方法是拥有汇编阶段。它究竟意味着什么? 将getDepartment API分解为DAO的不同API?
解决方案3)使用DTO 即使使用DTO,持久层如何知道视图是否需要完全加载的部门。 导致将API分解为getDepartmentOnly()getDepartmentWithEmployees()和其他人说是否获得100%的部门对象或部分对象 一个API分解为许多映射到许多DTO的实体
解决方案4)正如在bohzo的文章中使用分页视图时,请避免延迟加载并查询以获取有限的结果
请更正解决方案2并解释hibernate文档中的内容?
答案 0 :(得分:3)
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)。