首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有找到用于h2测试的GenerationType.AUTO序列“GenerationType.AUTO”

没有找到用于h2测试的GenerationType.AUTO序列“GenerationType.AUTO”
EN

Stack Overflow用户
提问于 2018-08-03 14:20:43
回答 3查看 11.2K关注 0票数 6

我正在尝试将我们的一个服务迁移到SpringBoot2.0.3。虽然大多数测试都很好,但其中一个测试失败时出错:

代码语言:javascript
复制
Caused by: org.h2.jdbc.JdbcSQLException: Sequence "HIBERNATE_SEQUENCE" not found; SQL statement:
call next value for hibernate_sequence [90036-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.command.Parser.readSequence(Parser.java:5970)
    at org.h2.command.Parser.readTerm(Parser.java:3131)
    at org.h2.command.Parser.readFactor(Parser.java:2587)

这确实令人困惑,因为所有teh实体都依赖于同一代id机制:

代码语言:javascript
复制
@GeneratedValue(strategy = GenerationType.AUTO)

这是一个存储库测试,存储库本身是非常直接的:

代码语言:javascript
复制
@Repository
public interface OrderDetailsRepository extends JpaRepository<OrderDetails, Long> {

    OrderDetails findFirstByOrderIdOrderByIdDesc(String orderId);
}

这里有什么可能出错?

PS:,是的,实体中同时存在orderIdId字段。

EN

回答 3

Stack Overflow用户

发布于 2019-09-06 22:33:24

选择@GeneratedValue(strategy = GenerationType.AUTO)时,Hibernate根据特定于数据库的方言选择生成策略。在您的示例中,问题是hibernate找不到HIBERNATE_SEQUENCE,因此无法为序列创建新对象。尝试添加这样的序列,它可以解决问题,但可能导致与数据不一致.

代码语言:javascript
复制
CREATE TABLE CUSTOMER(
  id int primary key,
);

CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1 INCREMENT BY 1;

我建议使用GenerationType.SEQUENCE,并尝试使用自定义db序列重新创建id模式。您可以阅读有关GenerationType的这里的更多信息

票数 10
EN

Stack Overflow用户

发布于 2019-12-21 20:30:10

在用h2编写spring引导示例代码时,我遇到了同样的问题。请找出以下我的调查结果的细节。在您的实体类中,没有给出序列并检查您的表,即您是否为主键指定了AUTO_INCREMENT?

请如下所示。1.检查ddl一次,并将auto_increment设置为主键(见下面的id)

代码语言:javascript
复制
    CREATE TABLE EMPLOYEES (
  id INT AUTO_INCREMENT  PRIMARY KEY,
  first_name VARCHAR(250),
  last_name VARCHAR(250),
  email VARCHAR(250) DEFAULT NULL
);
  1. 检查实体类并更新主键,如下所示 公共级雇员{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY)私有长id; 请注意,GenerationType被赋予身份,您也可以给汽车。另外,如果您使用的是h2内存中的DB和表,而启动启动时插入的记录很少(如果dml文件在资源中可用),那么hibernate插入可能会给出唯一的约束,因为序列1,2,3..(取决于启动时插入的记录)可能已经使用了多少,正如我前面所说,hibernate将从1生成序列,并在每次新插入时增加1。因此,我建议不要在启动时插入记录,最好以编程方式插入。 对于您的学习,您可以使用上面给出的,但是如果它可以用于生产,那么更好地实现您自己的逻辑来生成序列。
票数 5
EN

Stack Overflow用户

发布于 2020-08-01 06:54:28

我也有类似的问题。如果我对事情的理解是正确的,事情就会这样下去。

在Spring升级之前,我使用了AUTO,但实际上它默认选择了身份策略。我有如下定义的自动递增PKs:

代码语言:javascript
复制
id            BIGINT AUTO_INCREMENT PRIMARY KEY

一切都很好。

在春季升级时,我必须指定H2方言:

代码语言:javascript
复制
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

我已经读过,如果您使用Hibernate作为持久性提供程序,它将根据特定于数据库的方言选择生成策略。对于H2,它可能选择了全局序列(根据JPA规范,这就是AUTO的意思),但是它没有找到序列。当然,解决方案是创建序列(如上面所建议的)或手动覆盖到最初自动选择的标识。

CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1 INCREMENT BY 1;

代码语言:javascript
复制
@GeneratedValue(strategy = GenerationType.IDENTITY)

我认为,根本原因是,自动的含义是/不一致的/明确的定义/理解的时间。可能原来的“自动”切换到身份基本上是一个错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51674681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档