Spring Boot H2 db模式oracle

use*_*453 9 java h2 spring-test spring-data spring-data-jpa

您好,我有一个 Spring Boot 应用程序(2.3.1.RELEASE,ojdbc8),基本上它连接到 Oracle 数据库。

Spring Boot 应用程序在连接到 Oracle 数据库时启动 find。但是,当集成测试连接到 H2 嵌入式数据库时,它无法启动,并且我的一些查询失败并显示以下错误消息:

Caused by: java.lang.NullPointerException: null
    at org.hibernate.hql.internal.NameGenerator.generateColumnNames(NameGenerator.java:27)
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames(SessionFactoryHelper.java:434)
Run Code Online (Sandbox Code Playgroud)

我设法通过在 application-test.yml 文件中添加以下代码行来使其工作:

spring:
  jpa:
    database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)

请修改以下 application-test.yml 配置:

spring.datasource:
  url: jdbc:h2:mem:db;Mode=Oracle;DB_CLOSE_DELAY=-1
  username: sa
  password: sa
  driverClassName: org.h2.Driver
# added empty context path to override application.yml context path
server:
  servlet:
    contextPath:
spring:
  jpa:
    database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)

应用程序启动良好并且集成成功完成,但是日志中可能会显示以下异常:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ALL_SEQUENCES" not found; SQL statement:
select * from all_sequences [42102-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.Parser.readTableOrView(Parser.java:7628) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.Parser.readTableFilter(Parser.java:1970) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.Parser.parseSelectFromPart(Parser.java:2827) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.Parser.parseSelect(Parser.java:2959) ~[h2-1.4.200.jar:1.4.200]
    
    
    ....
    
    org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table dash_processed cascade constraints" via JDBC Statement
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:375) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:359) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:241) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:154) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:126) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:112) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:145) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    
    ...
    
    drop table dash_processed cascade constraints [42102-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.ddl.DropTable.prepareDrop(DropTable.java:65) ~[h2-1.4.200.jar:1.4.200]
    at org.h2.command.ddl.DropTable.update(DropTable.java:124) ~[h2-1.4.200.jar:1.4.200]
Run Code Online (Sandbox Code Playgroud)

知道如何阻止这些错误吗?

提前致谢

小智 15

要使用 h2 数据库模拟 Oracle 和序列对象,请将此行添加到您的 spring boot application.properties 中:

spring.datasource.url=jdbc:h2:mem:testdb;Mode=Oracle
Run Code Online (Sandbox Code Playgroud)

h2 doc Oracle 兼容模式部分