假设:
PersonController
,@Transactional
操作save
PersonService
,方法populateProperties(PersonInstance)
从控制器操作我想基于数据库中已存在的一些数据来填充personInstance
属性,如下所示:
def personLookupData = PersonLookupData.findByUsername(personInstance.username)
personInstance.firstName = personLookupData.firstName
findByUsername
方法刷新hibernate会话并为了避免它(因为它一直给我描述here的问题),我这样做:
def personLookupData = PersonLookupData.withNewSession { PersonLookupData.findByUsername(personInstance.username) }
personInstance.firstName = personLookupData.firstName
这就是我想要的(让我在没有刷新会话的情况下使用findBy
),当只有几个findBy
可以使用时,这是很好的,但给定一个更深的调用堆栈(在服务方面)和不同地方的更多数据库查找,使用withNewSession
到处都变得有点难看。
除了使PersonLookupService
收集一个withNewTransaction
块中的所有必需数据并将其返回之外,还有其他好的(常规)方式吗?
答案 0 :(得分:1)
我认为你应该将@Transactional从PersonControlller移到PersonService。
如果您要在同一交易中包含更多服务呼叫,则需要使用标记为@Transactional的交易边界网关,并调用当前业务案例所需的所有服务。
MVC组件不负责控制事务。事务边界由服务层处理。