java - 使用 GenerationType.AUTO 未找到用于 h2 测试的序列 "HIBERNATE_SEQUENCE"

标签 java hibernate spring-boot h2

我正在尝试将我们的一项服务迁移到Spring Boot 2.0.3。
虽然大多数测试都很好,但其中一个失败并出现错误:

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)

这确实令人困惑,因为所有实体都依赖于相同的代 ID 机制:
@GeneratedValue(strategy = GenerationType.AUTO)

这是一个存储库测试,存储库本身非常简单:
@Repository
public interface OrderDetailsRepository extends JpaRepository<OrderDetails, Long> {

    OrderDetails findFirstByOrderIdOrderByIdDesc(String orderId);
}

这里可能出现什么问题?

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

最佳答案

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

CREATE TABLE CUSTOMER(
  id int primary key,
);

CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1 INCREMENT BY 1;

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

关于java - 使用 GenerationType.AUTO 未找到用于 h2 测试的序列 "HIBERNATE_SEQUENCE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51674681/

相关文章:

java - "Error: Could not find or load main class"JavaFX 终端

基于网络的Java桌面应用程序

Java Hibernate 级联问题

java - Spring/JPA/Hibernate 持久实体 : Nothing happen

hibernate - JPA 2.1 实体图返回重复结果

spring - 无法让 Oauth2 在最新版本的 Spring boot 中工作

java - 是否可以在 Spring 启动时将Web套接字与rest api一起使用?

java - Java库中如何设计JDBC访问?

java - 代码需要在 JSP 声明部分中使用 try/catch 而不是在 scriptlet 部分中?

java - 不使用带有 Autowire 的构造函数的模拟服务