Как представить отношение «многие ко многим», когда таблица соединения содержит тип идентификации - PullRequest
0 голосов
/ 23 мая 2019

Запуск Grails 3.3.10, у меня есть сущность Product, которая имеет отношение «многие ко многим» с таблицей «Сообщение» в двух отдельных полях (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 голосов
/ 03 июня 2019

Я бы использовал какой-то специальный класс для этого. Примерно так:

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'
...