我有两个域类User和Node。应满足以下条件。

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

  • 我试过了:
    class User {
       Node node
    }
    
    class Node {
    
      // constructor
      Node(User user) {
        addToUsers(user)
        save()
      }
    
      hasMany = [users: User]
    }
    

    前者不起作用。它不起作用,因为删除节点时,用户实例中有一个从属引用,该引用将不会自动删除。

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

    最佳答案

    使用这样的联接表:

    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
    }
    

    07-24 22:26