Spring Boot / Hibernate无法创建表

时间:2018-09-30 04:40:22

标签: mysql spring hibernate

当我尝试启动我的spring boot应用程序时,我得到此警告:

2018-09-30 07:34:23.097  INFO 59360 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: create table social_link (author_username varchar(255) not null, type varchar(255) not null, value varchar(255), primary key (author_username, type)) engine=MyISAM
2018-09-30 07:34:24.067  WARN 59360 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement

奇怪的是,我可以通过SQL工作台执行SQL语句而不会出现问题,然后一切正常。 这是负责该表的实体:

@Entity
public class SocialLink {

    @EmbeddedId
    private SocialLinkKeyEmbeddable id = new SocialLinkKeyEmbeddable();
    private String value;
    @ManyToOne
    @MapsId("author_username")
    @JoinColumns({
            @JoinColumn(name="author_username", referencedColumnName="author_username")
    })
    private Author author;

    //Getters and setters
}

@Embeddable
public class SocialLinkKeyEmbeddable implements Serializable {

    @Column(name = "author_username")
    private String author_username;
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getAuthor_username() {
        return author_username;
    }

    public void setAuthor_username(String author_username) {
        this.author_username = author_username;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }
}

public interface SocialLinkRepository extends CrudRepository<SocialLink, SocialLinkKeyEmbeddable> {
}

5 个答案:

答案 0 :(得分:5)

问题出在密钥的长度上。 MySQL假装它大于1000个字节。 MyISAM存储引擎似乎是一个普遍的问题。 为了修复它,我添加了:

$l = setcookie('token', $token);
    if (!$l) {
        die("Cookie could not set");
    }

到我的applicaiton.properties,现在问题已解决。 将此帖子用作参考 #1071 - Specified key was too long; max key length is 1000 bytes

答案 1 :(得分:1)

我将spring.jpa.database-platform属性设置为MySQL5Dialect导致了类似的问题。

将属性设置为MySQL8Dialect或将其完全删除(启用自动配置)即可解决问题。

答案 2 :(得分:0)

我在ID字段中添加了列长,以防止出现varchar(255)默认值。

@Entity
public class MyEntity {

    @Id
    @Column(length = 64)
    private String id;

...
}

答案 3 :(得分:0)

我有同样的问题。我通过在创建时将字符集分配给我的数据库来解决它:

CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb3;

答案 4 :(得分:0)

对于那些只使用 Hibernate(而不是 Spring)的人,从位于 hibernate.cfg.xml 文件中编辑 SQL 方言属性src/main/resources 文件夹。

<property name="dialect">org.hibernate.dialect.MySQL55Dialect</property>

或者完全删除方言属性。