Grails 域模型中的继承导致重复的外键

Posted

技术标签:

【中文标题】Grails 域模型中的继承导致重复的外键【英文标题】:inheritance in Grails domain model causes duplicate foreign keys 【发布时间】:2015-08-03 15:10:02 【问题描述】:

在我的 Grails 2.5.0 应用程序的域模型中,我有两个具有相同属性的类 IncomeBenefit。我想将这些存储在单独的数据库表中,但将公共字段移动到基类中。我想出的模型是:

class Assessment 

    Date dateCreated = new Date()
    User user

    static hasMany = [incomes: Income, benefits: Benefit]


class Benefit extends IncomeSource 

class Income extends IncomeSource 

abstract class IncomeSource 

    String name
    BigDecimal amount
    PaymentFrequency frequency

    static belongsTo = [assessment: Assessment]

    static mapping = 
        tablePerHierarchy false
    

这会为AssessmentBenefit之间的关系生成下表

AssessmentBenefit 之间的关系创建的表(不出所料)是相同的。

与其在assessmentbenefit 之间使用assessment_benefit 连接表,我更愿意在benefit 表中使用assessment_id 外键,从而消除对连接表的需要。

如何更改我的域模型以实现此目的?

【问题讨论】:

使用的 Grails 版本是什么?我使用了 Grails 2.4.4 并使用了您提供的域类,即 Assessment、Benefit、Income 和 IncomeSource。正如您所提到的,它没有创建额外的连接表。它还在福利、收入和收入来源表中添加了assessment_id。因此,很容易验证您是否提供了用于此示例的 Grails 版本。 我使用的是 Grails 2.5.0 是否如答案所示工作? 【参考方案1】:

如何更改我的域模型以实现此目的?

移动

static belongsTo = [assessment: Assessment]

从抽象父 IncomeSource 到子 Benefit 为:

class Benefit extends IncomeSource 
    static belongsTo = [assessment: Assessment]

您也可以将这种关系保留在基类中,并将belongsTo 也复制到子类中。

在任何一种情况下都不会为AssessmentBenefit 创建连接表。

如果需要类似的行为,同样适用于 Income

适用于 Grails 2.5.0

【讨论】:

以上是关于Grails 域模型中的继承导致重复的外键的主要内容,如果未能解决你的问题,请参考以下文章

具有意外相似重复的 postgres 用户表导致另一个表具有混乱的外键,如何修复和合并外键?

Grails 中的自定义验证器中的异常

您如何处理模型类中的外键关系

通过django模板中的外键关系快速访问模型属性

如何使用 Graphene-Django Relay 中的外键关系更新模型?

可以保存重复值的外键