首页 > 解决方案 > 休眠:不能删除外键

问题描述

有这两个类:

地址.java

@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Address {
    private String street;
    private String city;
    private String state;
    private String pincode;
}

用户.java

@Entity
@Data
public class User {
    @Id
    private int id;
    private String name;
    @ElementCollection
    private Set<Address> addresses = new HashSet<>();
}

演示应用程序.java

@Bean
CommandLineRunner dataLoader2(UserRepository userRepo){
  return  new CommandLineRunner() {
    @Override
    public void run(String... args) throws Exception {
      User u = new User();
      u.setName("Some random name");
      Address a1 = Address.builder()
          .street("First Street")
          .city("first city")
          .state("first state")
          .pincode("100001")
          .build();
      Address a2 = Address.builder()
          .street("Second Street")
          .city("Second city")
          .state("second state")
          .pincode("200002")
          .build();
      u.setAddresses(new HashSet<>(Arrays.asList(a1, a2)));
      userRepo.save(u);
    }
  };
}

运行时,如果失败并出现此错误:

GenerationTarget 遇到异常接受命令:通过 JDBC 语句执行 DDL“alter table user_addresses drop foreign key FKfm6x520mag23hvgr1oshaut8b”时出错

然而,决赛桌已创建 describe user_addresses

+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| user_id | int          | NO   | MUL | NULL    |       |
| city    | varchar(255) | YES  |     | NULL    |       |
| pincode | varchar(255) | YES  |     | NULL    |       |
| state   | varchar(255) | YES  |     | NULL    |       |
| street  | varchar(255) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+

describe user

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int          | NO   | PRI | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

为什么 jdbc 不能删除user_id表中的外键user_addresses?如何让jdbc这样做呢?

标签: javaspringhibernatejdbc

解决方案


“USER”是 MySQL 中的保留字,这可能是问题的根本原因。更改User实体的名称或@Table为其添加注释并定义不同的名称。

参考文档:


推荐阅读