【发布时间】:2014-08-03 06:01:18
【问题描述】:
在我们的 Restful 应用程序中,出于几个原因,我们决定使用 DTO 来屏蔽 Hibernate 域模型。
我们使用Service Layer 中的DTOMappers 手动将Hibernate 实体映射到DTO,反之亦然。
服务层示例:
@Transactional(readOnly=true)
public PersonDTO findPersonWithInvoicesById(Long id) {
Person person = personRepository.findById(id);
return PersonMapperDTOFactory.getInstance().toDTO(person);
}
主要概念可以这样解释:
JSON (Jackson parser) <-> Controller <-> Service Layer (uses Mapping Layer) <-> Repository
我们同意通过使用left join 执行HQL(或Criteria)来检索关联。
这主要是一种检索关系并避免N+1 select issue 的高效方式。
但是,当开发人员错误地忘记进行左连接时,仍然可以使用N+1 select issue。仍然会获取关系,因为PersonDTOMapper 将遍历Person 的Invoices 以转换为InvoiceDTOs。所以仍然会获取数据,因为DTOMapper 是在 Hibernate Session 处于活动状态的地方执行的(由Spring 管理)
有什么方法可以让我们的DTOMappers 中的Hibernate Session“不活跃”吗?我们将面临一个LazyInitializationException,这应该会触发开发人员他没有按预期获取一些数据。
我读过关于暂停交易的@Transactional(propagation = Propagation.NOT_SUPPORTED)。但是,我不知道它是用于此类目的的。
实现此目的的干净解决方案是什么?也非常欢迎替代品!
【问题讨论】:
标签: spring hibernate jpa transactions dto