使用MySQL,为什么Hibernate / JPA不为我创建外键约束?

时间:2012-01-04 00:30:14

标签: mysql hibernate jpa

在这里记录这个因为我浪费了一个小时试图解决这个问题。

我有一个实体Foo:

@ManyToOne(optional = false)
@JoinColumn(name = "barId")
private Bar bar;

为什么Hibernate不在foo.bar上创建外键约束 - > bar.id?

3 个答案:

答案 0 :(得分:14)

根据此处Hibernate: Create Mysql InnoDB tables instead of MyISAM的建议,您还可以更改 Hibernate dialect 以使用

org.hibernate.dialect.MySQL5InnoDBDialect

侵入性较小。

只是想将此作为替代解决方案添加。

答案 1 :(得分:9)

这是因为MySQL不支持使用ENGINE = MyISAM创建的表的外键约束。您需要使用ENGINE = InnoDB创建(两个!)表。您可以通过调整my.cnf,添加默认值或在JDBC URL中使用特殊变量来实现此目的:

jdbc:mysql://localhost/dbname?characterEncoding=utf8&sessionVariables=storage_engine=InnoDB

答案 2 :(得分:6)

使用SpringBoot,您可以将application.properties设置为:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect   

它应该可以正常工作。