2016-03-15 60 views
0

鑑於域類這樣的:Grails的/格姆:繼承和外鍵

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爲什麼會這樣做,從錯誤消息中它似乎認爲外鍵中的屬性列表是空的?

此外,我甚至無法提及類A中的類B,C或D,因爲類A是不知道這些類的插件的一部分。

編輯: 我可能只是廢除繼承和使用,而不是組成是這樣的:

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

這並不至少在啓動時炸燬,但還是:爲什麼呢?

+0

我懷疑問題是你在使用'belongsTo'而在另一邊沒有相應的'hasMany'。你能否*清除*你的班級名稱,以便你想要達到的目標更明顯? –

+0

增加了關於這方面的信息 –

回答

0

你可以照顧你的域類星座是這樣的:

class User { } 

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

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

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

這將創建一個雙向associationPatientMedicationPrescription之間,也PatientOtherStuff之間的一個一對多。請注意,每個belongsTo都有相應的hasMany

正如你已經發現的,你也可以使用組合。