我尝试实现几年前提到的同样的问题: Hibernate many to many with a composite key with one field shared on either side of the relationship
我有一个Menu和一个Item类,想要实现单向关系,菜单会保存它包含的所有项目。
Menu and Item both have composite keys out of the merchant_id foreign key and an auto incremental itemId/menuId.(EER Diagram Image)
因为当我声明一个复合键并且Id在系统中是唯一的时,Hibernate无法检索自动生成的Id,所以我保存实体而没有额外的embeddedId PKClass:
"Mixed"
w
正如您从注释代码中可以看到的,以下是我的问题所在的问题。如何在不修改规范化数据库表的情况下将实体映射到最佳状态? (他们需要在数据库中验证相同的商家)
答案 0 :(得分:0)
我怀疑你可能想要这样的东西:
CREATE TABLE `MENU_ITEM` (
`merchant_id` INT NOT NULL,
`menu_id` INT NOT NULL,
`item_id` INT NOT NULL,
PRIMARY KEY (`merchant_id`, `menu_id`, `item_id`),
INDEX `ix_menuitem_item` (`item_id`, `merchant_id`),
INDEX `ix_menuitem_menu` (`menu_id`, `merchant_id`),
INDEX `ix_menuitem_merchant` (`merchant_id`),
CONSTRAINT `fk_menuitem_merchant`
FOREIGN KEY (`merchant_id`)
REFERENCES `merchant` (`id`),
CONSTRAINT `fk_menuitem_menu`
FOREIGN KEY (`menu_id`, `merchant_id`)
REFERENCES `menu` (`id`, `merchant_id`),
CONSTRAINT `fk_menuitem_item`
FOREIGN KEY (`item_id`, `merchant_id`)
REFERENCES `item` (`id`, `merchant_id`)
)
但不幸的是,这不可能。
在最多1个外键中可以使用一列,在这种情况下MENU_ITEM.merchant_id
使用 3次(最多2个,删除{{1 }})。
所以,你可能想要一些等价物:
fk_menuitem_merchant
但遗憾的是,MySQL 不支持 CREATE TABLE `MENU_ITEM` (
`merchant_id` INT NOT NULL,
`menu_id` INT NOT NULL,
`menu_merchant_id` INT NOT NULL,
`item_id` INT NOT NULL,
`item_merchant_id` INT NOT NULL,
PRIMARY KEY (`merchant_id`, `menu_id`, `item_id`),
INDEX `ix_menuitem_item` (`item_id`, `merchant_id`),
INDEX `ix_menuitem_menu` (`menu_id`, `merchant_id`),
INDEX `ix_menuitem_merchant` (`merchant_id`),
CONSTRAINT `fk_menuitem_merchant`
FOREIGN KEY (`merchant_id`)
REFERENCES `merchant` (`id`),
CONSTRAINT `fk_menuitem_menu`
FOREIGN KEY (`menu_id`, `menu_merchant_id`)
REFERENCES `menu` (`id`, `merchant_id`),
CONSTRAINT `fk_menuitem_item`
FOREIGN KEY (`item_id`, `item_merchant_id`)
REFERENCES `item` (`id`, `merchant_id`),
CHECK (`merchant_id` = `menu_merchant_id`),
CHECK (`merchant_id` = `item_merchant_id`)
)
。
如您所见,这不是ORM问题。
所以,你有两个选择:
CHECK
(until.urlMatches
)让应用程序进行检查:
CHECK