【问题标题】:Hibernate with mariaDB generate Key in Mapping Table使用 mariaDB 休眠在映射表中生成密钥
【发布时间】:2019-08-26 10:02:41
【问题描述】:

您好需要一些有关 Hibernate 的 MariaDB 的指导和帮助,我在两个不同的表之间有多对多的映射,但是在启动服务器休眠时生成主键而不是唯一键不知道为什么?有方言问题吗?实体是这样的。

@ManyToMany(fetch = FetchType.LAZY,cascade=CascadeType.REFRESH)
@JoinTable(name = "step_childpage", 
joinColumns = @JoinColumn(name = "step_id"), 
inverseJoinColumns = @JoinColumn(name = "childpage_id"),
uniqueConstraints= {@UniqueConstraint(name="UK_step_childpage",columnNames= {"childpage_id","step_id"})},
foreignKey=@ForeignKey(name="FK_step_childpage_step_id"),
inverseForeignKey=@ForeignKey(name="FK_step_childpage_page_id")
)
public Set<BotPage> getChildPages() {
    return childPages;
}
public void setChildPages(Set<BotPage> childPages) {
    this.childPages = childPages;
}

虽然我在服务器启动时手动编写了表休眠更改。 修改后的表是这样的。

CREATE TABLE `page_childstep` (
    `page_id` BIGINT(20) NOT NULL,
    `childstep_id` BIGINT(20) NOT NULL,
    PRIMARY KEY (`childstep_id`, `page_id`),
    INDEX `FK_page_childstep_page_id` (`page_id`),
    CONSTRAINT `FK_page_childstep_page_id` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`),
    CONSTRAINT `FK_page_childstep_step_id` FOREIGN KEY (`childstep_id`) REFERENCES `teststep` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB

【问题讨论】:

    标签: mysql hibernate spring-boot mariadb hibernate-mapping


    【解决方案1】:

    PRIMARY KEY 是一个 UNIQUE 键。

    page_childstep 中的索引是最优的。

    • PK 允许有效地从子步骤到页面。
    • INDEX 允许有效地从页面到子步骤。

    注意:在 InnoDB 中,INDEX 隐式包含 PK 的列。所以INDEX(page_id) 实际上是一个由(page_id, childstep_id) 排序的BTree。

    BIGINT 太过分了;FK 需要付出一些努力。但这些是其他主题。)

    【讨论】:

    • 默认情况下,innodb 在映射表上创建键以及外键更快的访问是的,从长远来看,这会过度杀伤来自 db 的任何类型的操作
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多