Grails域类beforeDelete不作为事务处理

时间:2015-03-03 15:36:32

标签: grails gorm

我有一个用户域类,其中包含username,fullName,...等属性以及UserRole关联类。

在我的域类中,我在beforeDelete方法上有以下代码

def beforeDelete() {
    UserRole.removeAll(this);
}

在UserRole类中,我有像这样的removeAll方法:

static void removeAll(User user) {
    executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
}

对delete方法的调用是在我的UserService类

中完成的
def delete(User userInstance){
   userInstance.delete()
}

我期待的是:当删除失败时,应该执行回滚,但即使删除失败,也会删除所有UserRole关联。

我错过了什么吗? beforeDelete方法不包含在与userService.delete(User userInstance)方法相同的事务中吗?

或者我应该将UserRole.removeAll()调用移动到UserService类?

Grails版本:2.3.11

Hibernate:3.6.10.16

1 个答案:

答案 0 :(得分:6)

除了服务之外,没有配置的Grails中没有任何内容是事务性的。没有@Transactional注释且没有static transactional属性的服务是事务性的。通过添加一个或@Transactional注释,您可以自定义服务和/或每个方法的行为。使服务非事务性的唯一方法是删除所有注释并设置static transactional = false。 Grails应用程序中的任何其他内容都不是事务性的。

您可以在控制器和域类@Transactional方法中使用withTransaction,但两者都是hackish,应始终使用服务。

您可以在域类中使用依赖注入,因此我将所有更新代码移动到服务方法并从域类事件方法中调用它:

class MyDomain {

   ...

   def myService

   def beforeDelete() {
      myService.beforeDeleteMyDomain this
   }
}

或者,既然你已经在服务中删除了,你可以用一种方法组合所有东西:

def delete(User userInstance){
   UserRole.removeAll userInstance
   userInstance.delete()
}