覆盖Grails Domain-Class中的delete()函数

时间:2013-10-28 16:21:17

标签: grails gorm grails-2.0 grails-domain-class

我有以下课程:

class User {
 String name
}

class Book {
  User user
}

我希望如果删除User对象,它还会删除包含用户实例的Book对象。由于我没有从User类到book类的关系,cascade delete将无效。

我可以将Book类编写为:

class Book {
  belongsTo = [user: 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)

1 个答案:

答案 0 :(得分:0)

这是业务逻辑满足Service类内部事务的地方。如果我按照你的定义使用这个关系,我就会这样做:

def UserService {

  static transactional = true

  def delete(Long userId) {
      def user = User.get(userId)
      def userBooks = Book.findAllByUser(user)
      userBooks*.delete()
      user.delete()
  }

}

然后从控制器调用此服务。

可以说,如果某本书确实属于某个用户,请定义该关系的两面,并且它应该级联。