【问题标题】:Override delete() function in Grails Domain-Class覆盖 Grails 域类中的 delete() 函数
【发布时间】:2013-10-28 16:21:16
【问题描述】:

我有以下课程:

class User {
 String name
}

class Book {
  User user
}

我希望如果我删除一个用户对象,它也会删除包含用户实例的 Book 对象。由于我没有从 User 类到 book 类级联删除将不起作用。

我可以将 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 类的 delete() 函数?

我尝试了以下方法,但失败了。

 def delete() {
   def books = Book.findAllByUser(this)
   books.each { it.delete(flush: true) }
 }
 super.delete(flush: true)

【问题讨论】:

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


    【解决方案1】:

    这是业务逻辑在 Service 类中遇到事务的地方。如果我使用您定义的关系,我会这样做:

    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。尤其是在操纵多个域时。我没有把它放在模型中,因为我想要事务控制,而且我不喜欢模型中的那种业务逻辑。
    • 事务控制是指所有事情都发生在一个事务中?这在模型中是不可能的吗?
    • 我认为服务是事务性的 = 默认情况下为真?
    • 我真的不知道模型(域)中的事务是如何工作的。我确实知道它们如何与服务一起工作,这就是为什么我建议将您的业务逻辑放入服务中的原因。老实说,我认为如果你让关系成为双向的,你会让你的生活变得更简单。然后您需要做的就是删除用户,书籍删除将级联。如果那是你所追求的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多