在这里记录这个因为我浪费了一个小时试图解决这个问题。
我有一个实体Foo:
@ManyToOne(optional = false)
@JoinColumn(name = "barId")
private Bar bar;
为什么Hibernate不在foo.bar上创建外键约束 - > bar.id?
答案 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
它应该可以正常工作。