【问题标题】:Hibernate: cannot drop foreign key休眠:不能删除外键
【发布时间】:2021-11-01 08:43:59
【问题描述】:

有这两个类:

Address.java:

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

User.java

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

DemoApplication.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 遇到异常接受命令:错误 执行 DDL "alter table user_addresses drop foreign key FKfm6x520mag23hvgr1oshaut8b" 通过 JDBC 语句

然而,决赛桌已经创建: 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_addresses 中删除外键 user_id?如何让jdbc这样做?

【问题讨论】:

  • 您使用的是哪个数据库?
  • 如果从命令行客户端运行该 DDL 会发生什么?您收到更好的错误消息了吗?
  • @JoãoDias mysql
  • @tgdavies在mysql客户端,正确通过(即外键成功drop)

标签: java spring hibernate jdbc


【解决方案1】:

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

参考文档:

【讨论】:

    【解决方案2】:

    User 是 mysql 的反向关键字,请在类名User@Table(name="User_master") 及以上Address 上面放@Table(name="Address_master")

    你建立一个实体与另一个实体是错误的,请参阅此处如何builder 工作https://howtodoinjava.com/design-patterns/creational/builder-pattern-in-java/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多