【问题标题】:GORM hasMany using multiple columnsGORM hasMany 使用多列
【发布时间】:2014-06-02 18:20:32
【问题描述】:

我有一堂课如下

class PrefValue extends MainDomain {

    String entityClass
    Long entityId
    ....
}

我现在正在尝试将一个集合映射到两个不同的类

class TypeA extends MainDomain {
  Long entityId
  static hasMany = [preferences:PrefValue]
  static mappedBy = [preferences: "entityId"]
  ...
}
class TypeB extends MainDomain {
  Long entityId
  static hasMany = [preferences:PrefValue]
  static mappedBy = [preferences: "entityId"]
}

出现问题是因为 TypeA 和 TypeB 可以具有相同的 ID,但它们将具有不同的 entityClass 值。我将如何映射它?

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    我假设entityId 是主键,当TypeATypeB 的主键值相同时会导致问题。

    在这种情况下,您可以删除主键约束,而改用复合主键。文档更详细地介绍了它here

    如果您不是主键并且只是具有唯一约束,那么您可以使 entityId 每个鉴别器唯一:

    static mapping = { entityId unique: 'entityClass' }

    【讨论】:

    • 所以你对 entityId 的看法是对的,但 entityClass 是字符串形式的类名(TypeA TypeB)。那么这仍然有效吗?会影响持久性吗?
    • @Jackie 是的,我相信 unique 的工作方式是通过在给定另一列的值的情况下检查该值是否唯一。我不确定为什么它会影响持久性。如果验证失败,那么 GORM 将不会持久化它,但您是在问别的问题吗?您可以随时编写一些集成测试来检查这一点。
    • 啊,我一开始并不清楚您在谈论“PrefValue”类的 Id。我现在明白了,明天我会尝试一些东西。我只是想知道我是如何让它知道我想要的组合是带有“X”实体类的组合。我认为这可能有效,因为实体 ID 在该类中不是唯一的,只有 TypeA 和 TypeB 将其用作 ID。谢谢! (不会因为某种原因让我@你)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多