Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 顺序;休眠“U序列”;找不到GenerationType.AUTO的h2测试_Java_Hibernate_Spring Boot_H2 - Fatal编程技术网

Java 顺序;休眠“U序列”;找不到GenerationType.AUTO的h2测试

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

我正在尝试将我们的一项服务迁移到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.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)