Grails 域模型中的继承导致重复的外键
Posted
技术标签:
【中文标题】Grails 域模型中的继承导致重复的外键【英文标题】:inheritance in Grails domain model causes duplicate foreign keys 【发布时间】:2015-08-03 15:10:02 【问题描述】:在我的 Grails 2.5.0 应用程序的域模型中,我有两个具有相同属性的类 Income
和 Benefit
。我想将这些存储在单独的数据库表中,但将公共字段移动到基类中。我想出的模型是:
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
这会为Assessment
和Benefit
之间的关系生成下表
为Assessment
和Benefit
之间的关系创建的表(不出所料)是相同的。
与其在assessment
和benefit
之间使用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
也复制到子类中。
在任何一种情况下都不会为Assessment
和Benefit
创建连接表。
如果需要类似的行为,同样适用于 Income
。
适用于 Grails 2.5.0
【讨论】:
以上是关于Grails 域模型中的继承导致重复的外键的主要内容,如果未能解决你的问题,请参考以下文章
具有意外相似重复的 postgres 用户表导致另一个表具有混乱的外键,如何修复和合并外键?