【发布时间】:2012-02-01 23:40:46
【问题描述】:
在这里记录这一点,因为我只是浪费了一个小时试图弄清楚这一点。
我有一个实体 Foo:
@ManyToOne(optional = false)
@JoinColumn(name = "barId")
private Bar bar;
为什么 Hibernate 不在 foo.bar -> bar.id 上创建外键约束?
【问题讨论】:
在这里记录这一点,因为我只是浪费了一个小时试图弄清楚这一点。
我有一个实体 Foo:
@ManyToOne(optional = false)
@JoinColumn(name = "barId")
private Bar bar;
为什么 Hibernate 不在 foo.bar -> bar.id 上创建外键约束?
【问题讨论】:
这里建议Hibernate: Create Mysql InnoDB tables instead of MyISAM 你也可以更改Hibernate dialect来使用
org.hibernate.dialect.MySQL5InnoDBDialect
侵入性较小。
只是想将此添加为替代解决方案。
【讨论】:
这是因为 MySQL 不支持使用 ENGINE=MyISAM 创建的表的外键约束。您需要使用 ENGINE=InnoDB 创建(两个!)表。您可以通过调整 my.cnf 并添加默认值或在 JDBC URL 中使用特殊变量来实现:
jdbc:mysql://localhost/dbname?characterEncoding=utf8&sessionVariables=storage_engine=InnoDB
【讨论】:
java.sql.SQLException: Unknown system variable 'storage_engine'
使用 SpringBoot,您可以将 application.properties 设置为:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
它应该可以正常工作。
【讨论】: