在事务上下文中使用findBy

时间:2014-12-16 10:43:29

标签: java hibernate grails transactions gorm

假设:

  • 控制器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块中的所有必需数据并将其返回之外,还有其他好的(常规)方式吗?

1 个答案:

答案 0 :(得分:1)

我认为你应该将@Transactional从PersonControlller移到PersonService。

如果您要在同一交易中包含更多服务呼叫,则需要使用标记为@Transactional的交易边界网关,并调用当前业务案例所需的所有服务。

MVC组件不负责控制事务。事务边界由服务层处理。