Grails域类beforeDelete不能作为事务类使用
我有一个用户域类,具有用户名、全名等属性。。。等和UserRole关联类 在我的域类中,我有以下关于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
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)并调用它,看看是否有帮助