Grails域类beforeDelete不能作为事务类使用

Grails域类beforeDelete不能作为事务类使用,grails,gorm,Grails,Gorm,我有一个用户域类,具有用户名、全名等属性。。。等和UserRole关联类 在我的域类中,我有以下关于beforeDelete方法的代码 def beforeDelete() { UserRole.removeAll(this); } 在UserRole类中,我有如下removeAll方法: static void removeAll(User user) { executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user

我有一个用户域类,具有用户名、全名等属性。。。等和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()
}
我期望的是:当删除失败时,应该执行回滚,但即使删除失败,所有用户角色关联都将被删除

我错过什么了吗? beforeDelete方法与userService.delete(User userInstance)方法未包装在同一事务中

还是应该将UserRole.removeAll()调用移动到UserService类

Grails版本:2.3.11


Hibernate:3.6.10.16

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

您可以在控制器中使用
@Transactional
,也可以在域类
with transaction
方法中使用,但这两种方法都是黑客行为,应该始终使用服务

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

class MyDomain {

   ...

   def myService

   def beforeDelete() {
      myService.beforeDeleteMyDomain this
   }
}
或者,由于您已经在服务中删除,您可以将所有内容合并到一个方法中:

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

尝试将调用移动到服务(removeAll)并调用它,看看是否有帮助