"HIBERNATE_SEQUENCE" 序列未找到;SQL 语句

47

在我的Spring MVC应用程序中,我有以下对象。我正在尝试使用devtool在我的应用程序中制作数据可视化。

在我的 Spring MVC 应用程序中,我有上述的对象。我尝试使用devtool 制作数据可视化。

@Entity
@Data
public class ConsultationRequest {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String email;

    private String purpose;

    private String programme;

    private int year;

    private String language;

    private String comments;
    @Enumerated(EnumType.STRING)
    private ConsultationStatus status;
}

然后我使用jpa创建实体:

@Repository
public interface ConsultationRequestRepository extends JpaRepository<ConsultationRequest, Long> {

}

问题在于当我加载我的应用程序时,我遇到了两个错误:

 Unsuccessful: drop sequence hibernate_sequence
[36morg.hibernate.tool.hbm2ddl.SchemaExport  Sequence "HIBERNATE_SEQUENCE" not found; SQL statement:

然后当我打开

http://localhost:8080/h2-console/

我看不到表格。在引导过程中似乎没有生成表格。

12个回答

95

请按以下方式更新您的代码:

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

由于您没有指定序列表名,Hibernate将寻找一个名为hibernate_sequence的序列表,并将其用作默认

对于Oracle/Postgres,使用的增量字段是序列表。
在MySQL中,有自动增加的增量字段。


28
如果有人在使用Spring Boot测试(带H2)时遇到此错误,则需要在application.properties(或者我们正在使用的任何配置文件)中使用以下内容:
spring.jpa.hibernate.ddl-auto=create-drop

1
我实际上使用了属性:spring.jpa.hibernate.ddl-auto=update。这不会覆盖数据,以防它们是在data.sql中使用非生成的键插入的。 - Tomas Antos
1
create-drop worked for POSTing data but not for loading from data.sql during startup with H2 database. The update value worked the opposite (worked fro data.sql but not for POST data) and the none value was the same as update - pamcevoy
1
这个完美地运行了,谢谢! - AdityaKapreShrewsburyBoston

12

将以下属性设置在属性文件中帮助我解决了Hibernate 5.4版本中hibernate_sequence问题。

spring:
  jpa:
    hibernate:
      use-new-id-generator-mappings: false

1
我已经在这上面浪费了半天时间,尝试了所有的方法。直到我找到了这个解决方案,才解决了问题。在测试我的数据库代码时,我使用Liquibase创建数据库模式,并填充一些数据。在我的测试中,我总是遇到这个错误: Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "HIBERNATE_SEQUENCE" not found; SQL statement这就是解决方法: spring.jpa.hibernate.use-new-id-generator-mappings=false - razvang
这也是我的解决方案。我也使用liquibase来创建数据库表,目标是PostgreSQL,测试时使用H2。在PostgreSQL中,自增功能通过创建序列来实现,但在H2中不起作用。对我来说,这是解决方案,因为H2数据库不是持久的,我只需要一个新的下一个序列ID进行测试。 - md_rasler

8

请检查persistence.xml

property name="hibernate.hbm2ddl.auto" value="create"

不是 hdm2ddl

这在我的情况下起作用了。


3

启动 Spring Boot 应用时出现 SQL 操作错误。

我在 Spring 属性中添加了设置并解决了问题:将 spring:jpa.hibernate.ddl-auto 设置为 create-drop,使 Hibernate 能够自动创建或删除表。


2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

2
如果您使用了Liquidbase的第二个缓存,您需要按照以下方式在changelog中添加序列:
<changeSet author="liquibase-docs"
    id="createSequence-example">
    <createSequence catalogName="cat" cycle="false"
        incrementBy="1" ordered="true" schemaName="public"
        sequenceName="hibernate_sequence" startValue="0" />
</changeSet>

0
我在运行一些测试时遇到了这个问题。添加这些注释帮助我解决了这个问题:
@Transactional
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)

0
对于使用 spring-boot 2.7.xh2 2.x 的情况,你需要在数据库连接中添加 MODE=LEGACY;
例如 application.yml 文件:
spring:
  datasource:
    url: jdbc:h2:mem:test;MODE=LEGACY;

示例 application.properties:

spring.datasource.url=jdbc:h2:mem:test;MODE=LEGACY;

0
如果有人在测试存储库时遇到了这个问题,修改以下代码可能会对您有所帮助:

从这里开始:

@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

变为:

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

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

使用

spring.jpa.hibernate.use-new-id-generator-mappings=false

在test-config.properties里对我起作用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接