grails - Grails 域模型中的继承

标签 grails grails-orm

我的 Grails 应用程序的域模型具有以下要求:

  • 一个用户属于零个或一个组织
  • 组织是慈善机构或公司
  • 慈善机构和公司有一些通用字段和一些(不可为空的)字段,这些字段对于每种组织类型都是唯一的

  • 我把常见的组织领域放到了一个摘要中 Organisation哪个类(class)CharityCompany两者都延伸。我无法将此层次结构存储在单个表中,因为存在特定于每个组织类型的不可为空的字段。域模型的相关部分如下所示:
    class User {
      String name
    
      static belongsTo = [organization: Organization]
    
      static constraints = {
        organization nullable: true
      }
    }
    
    abstract class Organization {    
        String name
    
        static hasMany = [users: User]
    
        static mapping = {
            tablePerHierarchy false
        }
    }
    
    class Charity extends Organization {
      // charity-specific fields go here
    } 
    
    class Company extends Organization {
      // company-specific fields go here
    }
    

    看这个模型生成的MySQL模式,组织-公司和组织-慈善的继承关系似乎完全被忽略了。虽然有一个带有名称列的组织表,但它与公司或慈善机构都没有主外键关系

    最佳答案

  • 对于 MySQL 和 H2,我看到的结果与 IanRoberts 相同。换句话说:没有生成连接表,但是预期的 organization_id FK在users table 。
  • 使用“每个子类的表”映射( tablePerHierarchy false ),您最终会在数据库中获得隐含的一对一关系。 Charity 的主键和 Company将具有与父项 Organization 的 PK 相同的值. GORM/Hibernate3 生成的模式似乎没有通过参照完整性约束来强制执行这一点。这是纯粹的 Hibernate 魔法。更详细一点 here
  • 关于grails - Grails 域模型中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21486063/

    相关文章:

    hibernate - Grails 域模型中的继承会导致重复的外键

    grails - 如何修复未刷新的GrailsWebApplicationContext?

    grails - 关于域更新的grails项目

    grails - 使用 grails criteria api 定义 OR 条件

    grails-orm - 当集群中的两个应用程序服务器启动 LiquiBase 更新(通过 Grails)时会发生什么?

    grails - GORM 使用外键而不是域对象

    grails - 无法解析名称为 '/hello/index' 的 servlet 中名称为 'grailsDispatcherServlet' 的 View

    grails - Grails:运行应用程序时出错

    security - Grails Spring Security 插件 - 与用户域一对一关联

    grails - GORM 抽象域类