正在运行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的那些。这可能吗?如果可以,我需要添加什么?
修改 我只是意识到我可能会通过陈述多对多关系,然后将示例简化为仅显示一对多来使事情感到困惑。请注意,我的问题是联接表中的类型,而不是如何表示多对多。
答案 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'