【问题标题】:GORM - Model Relationships Between Like EntitiesGORM - 相似实体之间的模型关系
【发布时间】:2013-08-07 16:51:59
【问题描述】:

对于我的项目,我使用的是 Grails,但这是一个一般性的 ORM 问题。

我是 ORM 和 ER 图的新手,并试图弄清楚如何最好地描述/实现以下内容:

我有 2 个实体:用户、连接

一个连接由 2 个用户(和其他原始属性)组成。一个用户可以在多个 Connection 中找到。您如何描述 User 和 Connection 之间的关系?我不知道你会怎么称呼它,2对很多?您将如何在 ER 图中绘制它。

在GORM中,应该是双向关系吗?

编辑

作为附加要求,假设用户在关系中具有特定角色。像学生和老师。因此 Connection 将具有 User 类型的学生和教师属性。

【问题讨论】:

    标签: grails orm grails-orm


    【解决方案1】:

    问题不在于 GORM,您的问题与实体有关。在对域类进行编码之前,您必须清楚地描绘出您想要保留和操作的信息。根据您的问题和 cmets,您更喜欢使用任何 RDBS。因此,让我们尝试对简单的表格进行成像(不要关心任何 ORM、Grails、双向\单向)并尝试填充这些表格的模拟细节。

    用户

    • 昵称(字符串)
    • 其他用户字段

    连接

    • 老师(用户)
    • 学生(用户)
    • 其他连接字段

    好吧,现在我们知道所有用户和所有连接。对于给定的连接,我们可以说谁是老师 - connection.teacher 和学生 - connection.student。

    注意:任何连接都只有两个用户。

    关注用户。任何用户都可以是学生和教师。如果用户只能是学生或教师,则必须添加其他字段,例如

    用户

    • 昵称(字符串)
    • isTeacher(布尔值)
    • 其他用户字段

    现在我们有了一个用户列表并且知道谁是 st。或技术。 如何获得给定用户的所有连接? GORM 提供:Connection.findAllByStudent(givenUser)、Connection.findAllByTeacher(givenUser)

    这些表格是否完整地显示了您的信息?

    【讨论】:

      【解决方案2】:

      我认为您想要的可以描述为many-to-many relationship,并在 Connection users 集合上应用了某种约束。至于单向/双向,我相信您可以根据您的用例来完成任何一项工作——尽管单向可能更难映射/配置。

      我还没有测试过这个,但是双向多对多应该是这样的

      class Connection {
        ...
        Set users = [] //ensure users exists, constraints won't work on null 
        static belongsTo = [User] 
        static hasMany = [users: User]
      
        static constraints = {
          users maxSize: 2
        }
      }
      
      class User {
        ...
        static hasMany = [connections: Connection]
      }
      

      我没有想到单向示例,但我相信您可能需要使用额外的映射类。

      同样,我没有对此进行测试,但这里有一个 单向 多对多与映射类的示例

      class Connection {
        ...
        Set users = []
        static hasMany = [users: ConnectionUser]
        static constraints = {
          users maxSize: 2
        }
      }
      
      class User {
        ...
      }
      
      class ConnectionUser {
        User user
        Connection connection
        //or for cascading effects
        //static belongsTo = [connection: Connection]
        ...
        ... //lots of additional code to manage adding,
        ... //removing, updating Connection-to-User relationships
      } 
      

      Connection 知道用户,但用户不知道他们所属的 Connection。如果您使用映射类路由,则需要手动管理连接到用户的关系。看看Spring Security Core PersonAuthority类的映射类示例。

      【讨论】:

      • 非常感谢您的回复。我想这是有道理的。在接受答案之前,我将看看其他人是否有任何想法。
      • 如果两个用户在连接中有特定的角色,需要是两个不同的字段怎么办。像学生和老师。但是一个学生仍然可以有很多老师。一个老师可以有很多学生。
      • 我想我可以让它成为一个有序集合而不是 2 个字段?但我想说connection.student或connection.teacher。
      • 或者也许只是为 hasMany 使用 Map 就可以了。只需使用 ["student"] 或 ["teacher"] 进行索引
      • 我认为你也可以让用户两个单独的字段,你只需要配置一个mappedBy,否则Grails会混淆
      猜你喜欢
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多