【问题标题】:Hibernate cannot create table hibernate_sequencesHibernate 无法创建表 hibernate_sequences
【发布时间】:2017-04-02 14:46:58
【问题描述】:

休眠版本:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.4.Final</version>
</dependency>

ExportDB.java:

public class ExportDB {
    public static void main(String[] args) {
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
        Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
        SchemaExport schemaExport = new SchemaExport();
        schemaExport.create(EnumSet.of(TargetType.DATABASE), metadata);
    }
}

运行ExportDB.java

2016-11-19 00:22:12,845 WARN [org.hibernate.orm.connections.pooling] - HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Hibernate: drop table if exists hibernate_sequences
Hibernate: drop table if exists user
Hibernate: create table hibernate_sequences (sequence_name varchar(255) not null, sequence_next_hi_value bigint, primary key (sequence_name))
Hibernate: create table user (id bigint not null, balance decimal(20,4) default 0.00, createTime time, displayName varchar(64), password varchar(64), username varchar(64), primary key (id))
Hibernate: alter table user add constraint UK_7kuje5s4lbyq9qyv1r9ecm2it unique (username)

数据库:

MariaDB [cms]> show tables;
+----------------+
| Tables_in_cms |
+----------------+
| investor       |
+----------------+
1 row in set (0.00 sec)

当我使用打印的 SQL 创建 hibernate_sequences:

MariaDB [cms]> create table hibernate_sequences (sequence_name varchar(255) not null, next_val bigint, primary key (sequence_name));
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

如何让ExportDB.java 可以创建hibernate_sequences

【问题讨论】:

  • 您的变量sequence_name 似乎太大而无法用作主键。看看这个问题:stackoverflow.com/questions/1814532/… 255 characters at 3 bytes per character 就是 765 bytes,加上需要额外的几个字节,所以超过了 767 的限制。

标签: java mysql hibernate mariadb


【解决方案1】:

您使用的是utf8mb4,对吗?而且您使用的是 5.6 或更早版本?

计划 A:升级到 5.7。

B 计划:将 255 减少到 191 或更少。 (你真的需要 255 吗??)

Plan C:改成CHARACTER SET utf8(假设你不需要Emoji或中文)

计划 D:通常,“序列”是数字。如果是这样,INT UNSIGNEDBIGINT UNSIGNED 不工作吗?

【讨论】:

【解决方案2】:

这是由于utf8mb4 字符集列定义在我的例子中。

无法在primary_key中使用太长的varchar列。

所以我们可以手动创建表并使其正确。

以下创建表查询可以解决问题。

create table hibernate_sequences (
   sequence_name varchar(255) CHARACTER SET utf8 not null ,
    next_val bigint,
    primary key (sequence_name)
) engine=MyISAM

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多