Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 圣杯&x27;在数据库级别实现双向一对一关系_Grails_Gorm - Fatal编程技术网

Grails 圣杯&x27;在数据库级别实现双向一对一关系

Grails 圣杯&x27;在数据库级别实现双向一对一关系,grails,gorm,Grails,Gorm,我有两个域类,它们以一对一的双向关系相互连接,这是使用hasOne实现的 class AssessmentData { static hasOne = [assessmentField:AssessmentField, assessment:Assessment] AssessmentField field } class Assessment { AssessmentData assessmentData } 但我对Grails在数据库级别实现这种关系的方式感到

我有两个域类,它们以一对一的双向关系相互连接,这是使用hasOne实现的

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查询日志记录程序。谢谢您的帮助……现在我的直觉不会让我失望。