Spring boot/Hibernate 创建表失败

Posted

技术标签:

【中文标题】Spring boot/Hibernate 创建表失败【英文标题】:Spring boot/Hibernate fails creating table 【发布时间】:2019-03-05 14:15:01 【问题描述】:

当我尝试启动我的 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> 

【问题讨论】:

能否请您也添加您的作者类别? 【参考方案1】:

对于只使用 Hibernate(而非 Spring)的用户,请编辑 hibernate.cfg.xml 文件中的 SQL dialect 属性,该文件位于 src/main/resources 文件夹。

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

或者完全删除 dialect 属性。

【讨论】:

【参考方案2】:

我遇到了由spring.jpa.database-platform 属性设置为MySQL5Dialect 引起的类似问题。

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

【讨论】:

【参考方案3】:

我遇到了同样的问题。我通过在创建时将 char 集分配给我的数据库来解决它:

CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb3;

【讨论】:

【参考方案4】:

我在我的 ID 字段中添加了一个列长度以防止 varchar(255) 默认值。

@Entity
public class MyEntity 

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

...

【讨论】:

【参考方案5】:

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

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

到我的 applicaiton.properties,现在问题已解决。 正在使用这篇文章作为参考 #1071 - Specified key was too long; max key length is 1000 bytes

【讨论】:

我在官方docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/dialect/… 中找不到'MySQL55Dialect' 但我试过了,它可以工作。你确定这不是“MySQL5Dialect”的错字吗?无论如何,它的工作原理很奇怪......

以上是关于Spring boot/Hibernate 创建表失败的主要内容,如果未能解决你的问题,请参考以下文章

创建名为“dataSource”+ Spring Boot + Hibernate 的 bean 时出错

Java Spring boot hibernate删除级联数据

Java - Spring Boot - Hibernate - JPA(@ManyToOne 发布错误)

<Spring Boot / Hibernate> 插入前删除未完成

Spring Boot Hibernate多对一不保存joinColumn结果

制作多个 EntityManager(Spring-Boot-JPA、Hibernate、MSSQL)