如何在联接表包含标识类型的情况下表示多对多关系

时间:2019-05-23 13:03:40

标签: grails gorm

正在运行Grails 3.3.10,我有一个Product实体,该实体与Message表在2个单独的字段(product.type1Messages和product.type2Messages)上具有多对多关系,并且“ type”字段位于连接数据库中的表。

是否可以使用映射将正确的消息放入正确的集合中?

请在下面找到我的代码:

CREATE TABLE `productmessage` (
  `productId` int(11) NOT NULL,
  `messageId` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  PRIMARY KEY (`productId`,`messageId`,`type`)
);
class Product {

    static hasMany = [ type1Messages: Message, type2Messages: Message ]

    static mappedBy = [ type1Messages: "type1Product", type2Messages: "type2Product" ]

    static mapping = {
        type1Messages joinTable: [name: 'productmessage', key: 'productId', column: 'messageId']
        type2Messages joinTable: [name: 'productmessage', key: 'productId', column: 'messageId']
    }
}
class Message {

    Product type1Product
    Product type2Product

    static mapping = {
        type1Product column: "productId"
        type2Product column: "productId"
    }
}

我需要我的product.type1Messages只在联接表中包含类型1的那些,而product.type2Messages要包含类型2的那些。这可能吗?如果可以,我需要添加什么?

修改 我只是意识到我可能会通过陈述多对多关系,然后将示例简化为仅显示一对多来使事情感到困惑。请注意,我的问题是联接表中的类型,而不是如何表示多对多。

1 个答案:

答案 0 :(得分:0)

我会为此使用一些特殊的类。像这样:

abstract class ProductMessage {
    Product product
    Message message
}

class Type1ProductMessage extends ProductMessage {

}

class Type2ProductMessage extends ProductMessage {

}
class Product {

    static hasMany = [ type1Messages: Type1ProductMessage, type2Messages: Type2ProductMessage ]
}

如果您不想使用抽象类,则可以将第一个作为主要类,并从第一个开始扩展第二个。

在数据库中它将被映射为:

'id'
'product_id'
'message_id'
'class'