只是Java / Hibernate / Spring / Mysql堆栈中的架构问题
我应该在服务层中使用OpenSessionInView Pattern还是使用DTO对象来抵消延迟加载异常。
从Service层返回Domain / Entity对象是一个好习惯吗?或者返回DTO对象是一个好习惯,后来这些对象在Web服务层中被序列化为xml / json。
答案 0 :(得分:1)
我遵循一条非常简单的规则:
DTO或多或少是从一个域到另一个域的转换。这意味着当我在两层之间进行物理分离时,我会使用DTO。
在您拥有JSP的情况下,您可以使用OpenSessionInView模式来避免大量过度工作转换模型等。
答案 1 :(得分:0)
由于视图反模式下开放会话的性能难以预测,因此我将始终使用DTO方法。
我正是为此用例创建了Blaze-Persistence Entity Views。您实际上将JPA实体的DTO定义为接口,并将其应用于查询。它支持映射嵌套的DTO,集合等,本质上是您期望的所有内容,此外,它还将提高查询性能,因为它将生成查询,仅提取您实际为DTO所需的数据。
您的示例的实体视图如下
@EntityView(Person.class)
interface PersonDto {
String getName();
}
查询看起来像这样
List<PersonDto> dtos = entityViewManager.applySetting(
EntityViewSetting.create(PersonDto.class),
criteriaBuilderFactory.create(em, Person.class)
).getResultList();