【问题标题】:Spring Hibernate MySql - Cannot add foreign key constraintSpring Hibernate MySql - 无法添加外键约束
【发布时间】:2016-05-05 11:00:35
【问题描述】:

我有一个正在运行的带有 Mysql 和 Hibernate 的 Spring Boot 应用程序。

启动时出现此错误

Unsuccessful: alter table SMARTPARK.illuminazione add constraint FK_4kmtr3q9e2hnaoutsxgahhm63 foreign key (id_interruttore) references SMARTPARK.interruttori (id_interruttore)
2016-05-05 08:46:35 ERROR SchemaUpdate:262 - Cannot add foreign key constraint

我有两个表/实体

Illuminazione.java 是(只是有趣的部分......)

@Entity
@Table(name = "illuminazione", catalog = "SMARTPARK")
public class Illuminazione {
    private int idilluminazione;
    private Interruttore interruttore;
    private Date dateTime;
    private Date lastDateTime;
    private boolean isLit;

    @ManyToOne
    @JoinColumn(name = "id_interruttore")
    public Interruttore getInterruttore() {
        return this.interruttore;
    }

    public void setInterruttore(Interruttore interruttore) {
        this.interruttore = interruttore;
    }

在 Interruttore.java 我与 Illuminazione 有 @OneToMany 关系

@Entity
@Table(name = "interruttori", catalog = "SMARTPARK", uniqueConstraints = @UniqueConstraint(columnNames = "id_interruttore"))
public class Interruttore implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int idInterruttore;
    private int numeroInterruttore;
    private String nomeInterruttore;
    private String descrizione;
    private List<Luce> luci;
    private GpioController gpio;
    private GpioPinDigitalOutput relePin;
    private Pin pin;
    private boolean remoto;
    private boolean stato;
    private Date dateTime;
    private Set<Illuminazione> illuminazione;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "interruttore")
    public Set<Illuminazione> getIlluminazione() {
        return illuminazione;
    }

    public void setIlluminazione(Set<Illuminazione> illuminazione) {
        this.illuminazione = illuminazione;
    }

每次我启动应用程序时,在启动期间我都会收到此错误(即使应用程序看起来运行良好......)

【问题讨论】:

  • idInterruttore 是主键吗?如果有,为什么要使用uniqueConstraints = @UniqueConstraint(columnNames = "id_interruttore")?你如何引导 Hibernate(更新架构、创建、什么都不做)?
  • 我对休眠什么都不做,数据库已经在那里,我只是连接到它。我连接SpringBoot默认进程
  • 看起来,Hibernate 无法添加 FK_4kmtr3q9e2hnaoutsxgahhm63,因为您的架构已经具有其他名称的此类约束。
  • @besmart,你设法让代码工作了吗?我面临同样的问题。非常感谢任何帮助。
  • 使用普通@Id注解检查

标签: mysql spring hibernate


【解决方案1】:

我遇到了类似的问题。 对我来说,显然 hibernate/Spring 没有使用 mysql Engine -INNODB ,你需要引擎 INNODB for mysql 来生成外键约束。 在 application.properties 中使用以下属性,使 spring boot/hibernate 使用 mysql 引擎 INNODB。所以外键约束有效,因此也删除级联

spring.jpa.hibernate.use-new-id-generator-mappings=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect 

【讨论】:

  • 受这个答案的启发,就我而言,我添加了这一行 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
【解决方案2】:

我有同样的错误信息,我发现这是由不正确的注释引起的。 Hibernate 试图运行

alter table cidades 
    add constraint FKdt0b3ronwpi1upsrhaeq6r69n 
    foreign key (estado_id) 
    references estados (id)

当我查看我的Cidade.java 时,我发现了这个映射

@ManyToOne
@JoinColumn(name = "cidade_id")
private Estado estado;

错误在"cidade_id",应该是"estado_id"。如果@besmart 可以提供数据库表信息那就太好了,因为错误可能是由拼写错误引起的(例如id_interruttore 实际上可能是id_interruttori)。

我希望这对将来的某人有所帮助。

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2020-02-09
    • 2021-10-16
    • 2013-03-10
    • 2021-11-05
    相关资源
    最近更新 更多