我有两个域类,它们彼此之间具有双向一对一关系,这是使用 hasOne 实现的。
class AssessmentData {
static hasOne = [assessmentField:AssessmentField, assessment:Assessment]
AssessmentField field
}
class Assessment {
AssessmentData assessmentData
}
但是我对Grails在数据库级别实现这种关系的方式感到很困惑。正如here所述,它只是在子域类中设置外键,在我的例子中,只设置为Assessment
和AssessmentField
表。我的原始本能是两个表都应该有一个外键相互引用,以便建立一对一的双向关系。但由于事实并非如此,我想知道Grails是如何实现的。
答案 0 :(得分:2)
我的原始本能是两个表都应该有一个外键相互引用才能建立一对一的双向关系
你的直觉让你失望了。您的问题中描述的域将生成这两个数据库表:
assessment_data
----------------
id
assessment
----------------
id
assessment_data_id
使用SQL,我们可以获得与ID为{4}的assessment
相关联的assessment_data
select * from assessment where assessment_data_id = 4
我们也可以采用另一种方式,使用
获取与{5}assessment_data
相关联的assessment
select ad.* from assessment_data ad
inner join assessment a ON a.assessment_data_id = ad.id
where a.id = 5
因此,如果我们可以在SQL中“双向”,那么我们可以使用HQL,条件查询,动态查找器等来完成它,因为这些最终都会被转换为SQL。