重写Grails域类中的delete()函数
我有以下课程:重写Grails域类中的delete()函数,grails,gorm,grails-2.0,grails-domain-class,Grails,Gorm,Grails 2.0,Grails Domain Class,我有以下课程: class User { String name } class Book { User user } 我希望如果我删除一个用户对象,它也会删除包含该用户实例的Book对象。因为我没有从用户类到图书类的关系,所以级联删除将不起作用 我可以将Book类编写为: class Book { belongsTo = [user: User] } 前者也不执行级联删除,因为用户类中仍然没有定义关系 我所做的是: class User { String name def
class User {
String name
}
class Book {
User user
}
我希望如果我删除一个用户对象,它也会删除包含该用户实例的Book对象。因为我没有从用户类到图书类的关系,所以级联删除将不起作用
我可以将Book类编写为:
class Book {
belongsTo = [user: User]
}
前者也不执行级联删除,因为用户类中仍然没有定义关系
我所做的是:
class User {
String name
def deleteUser() {
def books = Book.findAllByUser(this)
books.each { it.delete(flush: true) }
}
delete(flush: true)
}
我不认为这是最好的解决办法。我能做些什么呢?有没有办法以某种方式扩展User class delete()函数
我尝试了以下方法,但失败了
def delete() {
def books = Book.findAllByUser(this)
books.each { it.delete(flush: true) }
}
super.delete(flush: true)
这是业务逻辑在服务类内部满足事务的地方。如果我使用您定义的关系,我会这样做:
def UserService {
static transactional = true
def delete(Long userId) {
def user = User.get(userId)
def userBooks = Book.findAllByUser(user)
userBooks*.delete()
user.delete()
}
}
然后从控制器中调用此服务
可以说,如果一本书确实属于某个用户,请定义关系的双方,并将其级联。您会使用delete(flush:true)还是不使用flush?为什么不把这个方法放在模型中呢?在事务中处理时,我通常不使用flush。尤其是当多个域被操纵时。我之所以不把它放在模型中,是因为我想要事务性控制,而我不太喜欢模型中的那种业务逻辑。对于事务性控制,你的意思是所有事情都发生在一个事务中?这在模型中是不可能的吗?我认为服务是事务性的=默认值为true?我真的不知道事务在模型(域)中是如何工作的。我确实知道它们是如何与服务一起工作的,这就是为什么我建议将您的业务逻辑放在服务中的原因。老实说,我认为如果你让这段关系双向发展,你的生活就会简单得多。所有你需要做的就是删除用户,图书删除将级联。如果这是你所追求的行为。