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> 插入前删除未完成