Grails 圣杯&x27;在数据库级别实现双向一对一关系
我有两个域类,它们以一对一的双向关系相互连接,这是使用hasOne实现的Grails 圣杯&x27;在数据库级别实现双向一对一关系,grails,gorm,Grails,Gorm,我有两个域类,它们以一对一的双向关系相互连接,这是使用hasOne实现的 class AssessmentData { static hasOne = [assessmentField:AssessmentField, assessment:Assessment] AssessmentField field } class Assessment { AssessmentData assessmentData } 但我对Grails在数据库级别实现这种关系的方式感到
class AssessmentData {
static hasOne = [assessmentField:AssessmentField, assessment:Assessment]
AssessmentField field
}
class Assessment {
AssessmentData assessmentData
}
但我对Grails在数据库级别实现这种关系的方式感到相当困惑。如前所述,它只是将外键仅设置在子域类,在我的例子中,设置为评估
和评估字段
表。我的原始直觉是,两个表都应该有一个相互引用的外键,以便建立一对一的双向关系。但事实并非如此,我想知道Grails是如何做到这一点的
我的原始直觉是,两个表都应该有一个相互引用的外键,以便建立一对一的双向关系
你的直觉让你失望了。问题中描述的域将生成以下两个数据库表:
assessment_data
----------------
id
assessment
----------------
id
assessment_data_id
使用SQL,我们可以获得与id为4的评估数据
关联的评估
select * from assessment where assessment_data_id = 4
我们也可以走另一条路,使用
select ad.* from assessment_data ad
inner join assessment a ON a.assessment_data_id = ad.id
where a.id = 5
因此,如果我们可以在SQL中“双向”,那么我们可以使用HQL、条件查询、动态查找程序等来实现这一点,因为这些最终都会转换为SQL。也就是说,无论两个域类之间的单向/双向GORM映射如何,数据库级别的关系数据始终是双向的,因为单向映射将产生相同的模式效果。因此,在单向映射的情况下,Grails不方便我们在两个域类之间进行
连接
?还有一种方法可以找出Grails在运行时为动态查找器、HQL和条件查询生成的最终SQL吗?如果指定单向GORM映射,这意味着您只能在一个方向的对象之间导航,但在数据库中始终可以双向导航。如果您想查看Grails生成的SQL,可以在数据库级别打开查询日志记录,也可以在应用程序层使用各种Hibernate查询日志记录程序。谢谢您的帮助……现在我的直觉不会让我失望。