使用DTO或值对象模式来计算延迟加载异常

时间:2012-05-25 13:12:21

标签: java spring hibernate rest dto

只是Java / Hibernate / Spring / Mysql堆栈中的架构问题

我应该在服务层中使用OpenSessionInView Pattern还是使用DTO对象来抵消延迟加载异常。

从Service层返回Domain / Entity对象是一个好习惯吗?或者返回DTO对象是一个好习惯,后来这些对象在Web服务层中被序列化为xml / json。

2 个答案:

答案 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();