【发布时间】:2012-06-01 01:46:03
【问题描述】:
只是 Java/Hibernate/Spring/Mysql 堆栈中的架构问题
我应该在我的服务层中使用 OpenSessionInView 模式还是使用 DTO 对象来应对延迟加载异常。
从服务层返回域/实体对象是一种好习惯吗?还是返回 DTO 对象,稍后在 web 服务层序列化为 xml/json 是一种好习惯。
【问题讨论】:
标签: java spring hibernate rest dto
只是 Java/Hibernate/Spring/Mysql 堆栈中的架构问题
我应该在我的服务层中使用 OpenSessionInView 模式还是使用 DTO 对象来应对延迟加载异常。
从服务层返回域/实体对象是一种好习惯吗?还是返回 DTO 对象,稍后在 web 服务层序列化为 xml/json 是一种好习惯。
【问题讨论】:
标签: java spring hibernate rest dto
我遵循一个非常简单的规则:
DTO 或多或少是从一个域到另一个域的转换。这意味着我仅在两层之间有物理分离时才使用 DTO。
意思是如果你有 JSP,你可以使用 OpenSessionInView 模式来避免翻译模型等的大量过度工作。
【讨论】:
我总是使用 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();
【讨论】: