【问题标题】:inheritance in Grails domain model causes duplicate foreign keysGrails 域模型中的继承导致重复的外键
【发布时间】: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
  • 是否如答案所示工作?

标签: hibernate grails grails-orm


【解决方案1】:

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

移动

static belongsTo = [assessment: Assessment]

从抽象父 IncomeSource 到子 Benefit 为:

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

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

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

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

适用于 Grails 2.5.0

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多