Документируя это здесь, потому что я потратил час, пытаясь это выяснить.
У меня есть объект Foo с:
@ManyToOne(optional = false) @JoinColumn(name = "barId") private Bar bar;
Почему Hibernate не создает ограничение внешнего ключа дляfoo.bar -> bar.id?
Как предлагается здесь Hibernate: создание таблиц Mysql InnoDB вместо MyISAM вы также можете изменить Hibernate диалект для использования
org.hibernate.dialect.MySQL5InnoDBDialect
, который менее инвазивен.
Просто хотел добавить это как альтернативное решение.
Это потому, что MySQL не поддерживает ограничения внешнего ключа для таблиц, созданных с ENGINE = MyISAM. Вам нужно создать (обе!) Таблицы с ENGINE = InnoDB. Вы можете сделать это, настроив my.cnf и добавив значение по умолчанию, или используя специальную переменную в своем URL JDBC:
my.cnf
jdbc:mysql://localhost/dbname?characterEncoding=utf8&sessionVariables=storage_engine=InnoDB
С SpringBoot вы можете установить application.properties на:
application.properties
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
, и оно должно работать нормально.