Spring Hibernate MySql - 无法添加外键约束

时间:2016-05-05 11:00:35

标签: mysql spring hibernate

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

启动时,我收到此错误

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;
    }

每次启动应用程序时,在启动过程中我都会收到此错误(即使应用程序似乎运行良好......)

2 个答案:

答案 0 :(得分:5)

我有相同的错误消息,我发现这是由错误的注释引起的。 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)。

我希望这有助于将来的某些人。

答案 1 :(得分:1)

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

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