【问题标题】:Grails' implementation of bidirectional one-to-one relationship at the database levelGrails 在数据库级别实现双向一对一关系
【发布时间】:2012-01-17 12:14:13
【问题描述】:

我有两个域类,它们通过双向的一对一关系相互绑定,这是使用 hasOne 实现的。

class AssessmentData {

    static hasOne = [assessmentField:AssessmentField, assessment:Assessment]

    AssessmentField field
}


class Assessment {
   AssessmentData assessmentData
}

但是我对 Grails 在数据库级别实现这种关系的方式有点困惑。如here 所述,它只是将子域类的外键设置为仅在我的情况下为AssessmentAssessmentField 表。这是我的原始直觉,两个表都应该有一个相互引用的外键,以便建立一对一的双向关系。但既然不是这样,我想知道 Grails 是如何实现的。

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    我的原始直觉是两个表都应该有一个相互引用的外键,以便建立一对一的双向关系

    你的直觉让你失望了。您问题中描述的域将生成以下 2 个数据库表:

    assessment_data
    ----------------    
    id
    
    
    assessment
    ----------------
    id
    assessment_data_id
    

    使用 SQL,我们可以获得与 ID 为 4 的 assessment_data 关联的 assessment

    select * from assessment where assessment_data_id = 4
    

    我们也可以采用另一种方式,使用 id 为 5 获取与 assessment 关联的 assessment_data

    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 不方便我们在两个域类之间使用join 吗?有没有办法找出 Grails 在运行时为动态查找器、HQL 和条件查询生成的最终 SQL?
    • 如果您指定单向 GORM 映射,则意味着您只能在一个方向的对象之间导航,但您始终可以在数据库中双向进行。如果您想查看 Grails 生成的 SQL,您可以在数据库级别打开查询日志记录,或者有各种 Hibernate 查询记录器将在应用程序层执行此操作
    • 谢谢唐...非常感谢您的帮助...现在我的直觉不会让我失望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多