Java 顺序;休眠“U序列”;找不到GenerationType.AUTO的h2测试
我正在尝试将我们的一项服务迁移到SpringBoot2.0.3。 虽然大多数测试都正常,但其中一个测试失败并出现错误:Java 顺序;休眠“U序列”;找不到GenerationType.AUTO的h2测试,java,hibernate,spring-boot,h2,Java,Hibernate,Spring Boot,H2,我正在尝试将我们的一项服务迁移到SpringBoot2.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.getJdbcS
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);
}
@存储库
公共接口OrderDetailsRepository扩展了JpaRepository{
OrderDetails FindFirstByOrderIDDesc(字符串orderId);
}
这里可能会出什么问题
PS:是的,实体中同时存在
orderId
和Id
字段。当您选择@GeneratedValue(strategy=GenerationType.AUTO)
Hibernate根据数据库特定方言选择生成策略。
您案例中的问题是hibernate找不到hibernate_序列,因此无法为该序列创建新对象。尝试添加这样一个序列,应该可以解决问题,但可能会导致数据不一致
CREATE TABLE CUSTOMER(
id int primary key,
);
CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1 INCREMENT BY 1;
我建议使用GenerationType.SEQUENCE
并尝试用自定义db序列重新创建id模式。您可以阅读有关GenerationType的更多信息
我在为带有h2的spring boot编写示例代码时遇到了同样的问题。请在下面查找我的调查结果的详细信息。 在您的实体类中,没有给出序列,同时检查您的表,即您是否为主键提供了自动增量 请按以下说明进行。 1.检查您的ddl一次,并为主键设置自动增量(请参见下面的id)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
请注意,GenerationType是给定的标识,您也可以指定AUTO。此外,如果您在启动时使用内存数据库中的h2和表中插入的记录很少(如果资源中有dml文件),则hibernate插入可能会给出唯一的约束,因为序列1,2,3..(取决于启动时插入的记录数)可能已经使用了,正如我上面所说的,hibernate将从1生成序列,并且每次新插入都会增加1。因此,我建议不要在启动时插入记录,最好以编程方式插入。对于您的学习,您可以如上所述使用,但如果它可能用于生产,那么最好实现您自己的逻辑来生成序列
我也有类似的问题。如果我理解正确的话,事情会是这样的 在春季升级之前,我使用了自动-但它实际上默认选择了身份策略。我有如下定义的自动递增PKs:
id BIGINT AUTO_INCREMENT PRIMARY KEY
一切都很好
对于spring升级,我必须指定H2方言:
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
我已经读到,如果您使用Hibernate作为持久性提供程序,它会根据特定于数据库的方言选择一种生成策略。对于H2,它可能选择了全局序列(根据JPA规范,这是AUTO的意思),但它没有找到序列。
解决方案当然是创建序列(如上所述)或手动覆盖到最初自动选择的标识
CREATE SEQUENCE HIBERNATE\u序列从1开始,增量为1;
@GeneratedValue(strategy = GenerationType.IDENTITY)
我认为根本原因是自动的含义在时间上是/不一致的/定义不明确的/理解不清楚的。可能最初的“自动”切换到标识基本上是一个错误。如果切换到GenerationType.IDENTITY会发生什么?我在这方面比使用hibernate的自动更幸运。虽然两者都可以正常工作。它解决了问题,但它是AUTO对于其他实体,我希望它们保持一致。也许你可以全面更改策略?好吧,我可以这么做,但我是那种想知道为什么它在一个地方失败,而不是在另一个地方失败的人。是的,这很公平。我认为这些链接提供了一些见解。谢谢你提到spring.jpa.hibernate.ddl-auto I di不要检查它。
@GeneratedValue(strategy = GenerationType.IDENTITY)