mysql hibernate创建空表-启动时的hibernate_sequence

ckocjqey  于 2023-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(182)

所以我下载了hibernate 5.0.0.1,并尝试了我的项目,它以前使用hibernate 4.3。
当我插入数据库时,它给我这个错误:
错误:无法读取hi值-您需要填充表: hibernate 序列
我正在使用mysql,我的生成策略是在www.example.com上设置GenerationType.auto,现在似乎hibernate认为使用序列是生成值的最佳策略。但table是空的。我认为hibernate试图从序列中获取一个值,但找不到任何值。但是我很困惑,因为hibernate_sequence是由hibernate创建的,它不应该提供一个初始值吗?

lvjbypge

lvjbypge1#

序列表是因为你在一个/所有实体上定义主键的方式。

@Id
@GeneratedValue(strategy = GenerationType.AUTO) // or GenerationType.SEQUENCE
protected Long id;

如果要使用表的标识列:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;

您可以查看此线程以获取更多信息:https://forums.hibernate.org/viewtopic.php?f=1&t=999785&start=0
@GeneratedValue JPA注解
在这些教程中,我们经常使用@GeneratedValue注解来让数据库为我们生成一个唯一的主键。我们在每个示例中都使用了默认的生成类型,但实际上有四种不同的策略可以让数据库生成主键。这四个选项是:
AUTO IDENTITY TABLE SEQUENCE javax.persistence.GenerationType.AUTO
AUTO生成策略是默认的,此设置只是选择主键生成策略,该策略是所讨论的数据库的默认策略,通常是IDENTITY,尽管它可能是TABLE或SEQUENCE,具体取决于数据库的配置方式。通常建议使用AUTO策略,因为它使您的代码和应用程序具有最高的可移植性。
javax.persistence.GenerationType.IDENTITY
IDENTITY选项只允许数据库为应用程序生成唯一的主键。没有使用序列或表来维护主键信息,相反,数据库只会为Hibernate选择一个合适的、唯一的数字来分配给实体的主键。使用MySQL时,选择表中第一个编号最低的主键,尽管这种行为可能因数据库而异。
javax.persistence.GenerationType.Sequence
一些数据库供应商支持使用数据库序列对象来维护主键。要使用序列,请将GenerationType策略设置为SEQUENCE,指定生成器注解的名称,然后提供@SequenceGenerator注解,该注解具有用于定义序列注解的名称和数据库中实际序列对象的名称的属性。

disho6za

disho6za2#

对于MySQL用户:
CREATE TABLE hibernate_sequence ( next_val BIGINT );
如果有人需要Liquibase变更集:

<changeSet author="mate00" id="00">
    <createTable tableName="hibernate_sequence">
        <column name="next_val" type="BIGINT">
            <constraints nullable="true" primaryKey="true"/>
        </column>
    </createTable>
</changeSet>
<changeSet author="mate00" id="01">
    <insert tableName="hibernate_sequence">
        <column name="next_val">1</column>
    </insert>
</changeSet>

最好插入初始值1。

jaql4c8m

jaql4c8m3#

简单的解决方案:
将hibernate_sequence表创建为:

"create sequence <schema/db>.hibernate_sequence"
ryoqjall

ryoqjall4#

它之所以被创建,是因为Hibernate使用该表来跟踪自动增量ID(ID的下一个值)
前-

@Id
@GeneratedValue
int id;
idfiyjo8

idfiyjo85#

为了不创建此实体,请在配置中使用:

spring.jpa.properties.hibernate.id.new_generator_mappings=false

相关问题