重写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?我真的不知道事务在模型(域)中是如何工作的。我确实知道它们是如何与服务一起工作的,这就是为什么我建议将您的业务逻辑放在服务中的原因。老实说,我认为如果你让这段关系双向发展,你的生活就会简单得多。所有你需要做的就是删除用户,图书删除将级联。如果这是你所追求的行为。