Grails/Gorm:继承和外键

Grails/Gorm: Inheritance and foreign keys

给定域 类 像这样:

class A {   // in reality this is a basic User class that is required in multiple projects
}

class B extends A { // in reality B is a "patient"-kind of user. 
    static hasMany = [c: C]
}

// c/d is stuff like "MedicationPrescription", so basically data only relevant to the patient. However the system needs to realize that Patients are Users, as the User base class is used for spring security logins and in general has a lot of the basic data a person just has. (Name, etc.)
class C {
    static belongsTo = [b: B, a: A, d: D]
}

class D {
}

我收到这个错误:

org.hibernate.MappingException: Foreign key (FK_pwu2w72ul5a5213husrv3onr3:c [])) must have same number of columns as the referenced primary key (a [id])
        at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
        at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
        at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1818)
        at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1741)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
        at org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.secondPassCompile(HibernateMappingContextConfiguration.java:287)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
        at org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration.buildSessionFactory(HibernateMappingContextConfiguration.java:196)
        at org.grails.orm.hibernate.HibernateMappingContextSessionFactoryBean.doBuildSessionFactory(HibernateMappingContextSessionFactoryBean.java:476)
        at org.grails.orm.hibernate.HibernateMappingContextSessionFactoryBean.buildSessionFactory(HibernateMappingContextSessionFactoryBean.java:470)
        at org.grails.orm.hibernate.HibernateMappingContextSessionFactoryBean.afterPropertiesSet(HibernateMappingContextSessionFactoryBean.java:93)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        ... 41 common frames omitted

如果我删除 A 和 B 之间的继承,错误就会消失,但我的域中有这个星座。我不明白为什么 Gorm 会这样做,从错误消息来看似乎认为外键中的属性列表是空的?

此外,我什至不能在 class A 中提及 classes B、C 或 D,因为 class A 是插件的一部分,只是不知道这些 classes.

编辑: 我可能会取消继承并使用组合,而不是像这样:

class B {
  A a
  static hasMany = [c: C]
}

至少在启动时不会爆炸,但仍然:为什么?

你可以这样打理你的class星座:

class User { }

class Patient extends User {
    static hasMany = [prescriptions: MedicationPrescription, stuff: OtherStuff]
}

class MedicationPrescription {
    static belongsTo = [patient: Patient]
}

class OtherStuff {
    static belongsTo = [patient: Patient]
}

这会在 PatientMedicationPrescription 之间以及 PatientOtherStuff 之间创建双向一对多 association。请注意,每个 belongsTo 都有对应的 hasMany.

正如您已经发现的,您也可以使用组合。