Hibernate ManyToMany与常用外键的关系

时间:2017-01-15 10:32:31

标签: java mysql hibernate foreign-keys many-to-many

我尝试实现几年前提到的同样的问题: 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

正如您从注释代码中可以看到的,以下是我的问题所在的问题。如何在不修改规范化数据库表的情况下将实体映射到最佳状态? (他们需要在数据库中验证相同的商家)

1 个答案:

答案 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问题。

所以,你有两个选择:

  1. 实施一些触发器来模拟CHECKuntil.urlMatches
  2. 让应用程序进行检查:

    CHECK