【问题标题】:GORM Relations without dependent delete没有依赖删除的 GORM 关系
【发布时间】:2013-10-29 17:34:31
【问题描述】:

我有两个域类用户和节点。以下条件应成立。

  • 一个用户可以有零个或一个节点
  • 一个节点可以有一个到 n 个用户(它总是用一个用户实例初始化)
  • 如果您删除节点,用户将不会被删除
  • 如果删除用户,则节点中的引用将被删除

我试过了:

class User {
   Node node
}

class Node {

  // constructor
  Node(User user) {
    addToUsers(user)
    save()
  }  

  hasMany = [users: User]
}

前者不起作用。它不起作用,因为当您删除一个节点时,用户实例中有一个不会自动删除的依赖引用。

在这种情况下如何为领域类建模?

【问题讨论】:

  • 它“不起作用”怎么办?
  • @JamesKleeh 我更新了我的问题。
  • 用户表会发生什么?删除Node时如果有外键,则node_id不可能存在。

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


【解决方案1】:

使用这样的连接表:

class User {
    Set<Node> getNodes() {
        UserNode.executeQuery("select x.node from UserNode x where x.user = :user", [user: this])
    }

    def addToNodes(Node node) {
       def userNode = new UserNode()
       userNode.user = this
       userNode.node = node
       userNode.save()      
    }
}


class Node {
      Set<User> getUsers() { ... }
}

class UserNode {
   User user
   Node node
}

【讨论】:

    【解决方案2】:

    node 标记为可为空并将cascade 映射添加到 User 类,指定您想要级联的操作:

    class User {
        Node node
    
        static constraints = {
            node nullable: true
        }
    
        static mapping = {
            node cascade: 'save-update,delete'
        }
    
    }
    

    【讨论】:

    • 但我不希望删除一个用户时删除该节点。如果没有更多用户与该节点关联,我希望删除该节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2013-02-20
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多