Hibernate不会在Mysql中持久化外键

时间:2018-04-17 08:54:23

标签: java mysql hibernate jpa

我有一个拥有城市字段的实体Property。像这样:

@Entity
class Property {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    private City city;

    ...
}

所以每个房产(例如房屋或公寓)只属于一个城市。

现在有一件事,如果我尝试通过Hibernate记录生成的SQL,它会以正确的方式生成外键:

  

休眠:

 alter table property 
    add constraint FKdn1hnohufcwdr4a401xabcjn 
    foreign key (city_id_city) 
    references city (id_city)

但是,如果我检查我的Mysql数据库,那里没有外键,只生成索引:

show create table property;

导致:

| property | CREATE TABLE `property` (
  `id_property` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL,
  `deal_type` varchar(15) NOT NULL,
  `publisher_type` varchar(15) NOT NULL,
  `type` varchar(15) NOT NULL,
  `updated_at` datetime NOT NULL,
  `city_id_city` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_property`),
  KEY `FKdn1hnohufcwdr4a401xabcjn` (`city_id_city`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

所以问题是为什么我的数据库中没有CONSTRAINT FOREIGN KEY () REFERENCES定义?

3 个答案:

答案 0 :(得分:0)

注释@ManyToOne用于映射两个具有外键关系实例的表,它无法在数据库中自动创建外键

答案 1 :(得分:0)

您需要在城市实体中定义列表属性,并在那里添加关系

答案 2 :(得分:0)

在我切换到InnoDB引擎后,问题最终成为了数据库引擎,因为MyISAM没有实现外键。

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect