只是 Java/Hibernate/Spring/Mysql 堆栈中的架构问题
我应该在服务层中使用 OpenSessionInView 模式还是使用 DTO 对象来应对延迟加载异常。
从服务层返回域/实体对象是一种好习惯吗?还是返回 DTO 对象是一种好习惯,这些对象稍后会在 Web 服务层中序列化为 xml/json。
我遵循一个非常简单的规则:
DTO 或多或少是从一个域到另一个域的转换。这意味着我仅在两层之间有物理分离时才使用 DTO。
这意味着如果您有 JSP,您可以使用 OpenSessionInView 模式来避免翻译模型等的大量过度工作。
由于视图反模式中打开会话的不可预测的性能影响,我将始终使用 DTO 方法。
我为该用例创建了Blaze-Persistence 实体视图。您基本上将 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();