我有一个用户域类,其中包含username,fullName,...等属性和UserRole关联类.
在我的域类中,我在beforeDelete方法上有以下代码
def beforeDelete() {
UserRole.removeAll(this);
}
Run Code Online (Sandbox Code Playgroud)
在UserRole类中,我有像这样的removeAll方法:
static void removeAll(User user) {
executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
}
Run Code Online (Sandbox Code Playgroud)
对delete方法的调用是在我的UserService类中完成的
def delete(User userInstance){
userInstance.delete()
}
Run Code Online (Sandbox Code Playgroud)
我期待的是:当删除失败时,应该执行回滚,但即使删除失败,也会删除所有UserRole关联.
我错过了什么吗?beforeDelete方法不包含在与userService.delete(User userInstance)方法相同的事务中?
或者我应该将UserRole.removeAll()调用移动到UserService类?
Grails版本:2.3.11
休眠:3.6.10.16
除了服务之外,Grails中没有任何内容是没有配置的事务.没有@Transactional注释且没有static transactional属性的服务是事务性的.通过添加一个或@Transactional注释,您可以自定义服务和/或每个方法的行为.使服务非事务性的唯一方法是删除所有注释并设置static transactional = false.Grails应用程序中的任何其他内容都不是事务性的.
您可以@Transactional在控制器和域类withTransaction方法中使用,但两者都是hackish,应始终使用服务.
您可以在域类中使用依赖注入,因此我将所有更新代码移动到服务方法并从域类事件方法调用它:
class MyDomain {
...
def myService
def beforeDelete() {
myService.beforeDeleteMyDomain this
}
}
Run Code Online (Sandbox Code Playgroud)
或者,既然您已经在服务中删除,您可以在一个方法中组合所有内容:
def delete(User userInstance){
UserRole.removeAll userInstance
userInstance.delete()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |