Java 带有H2 JPA的Spring boot和JUnit导致';pg#U级';找不到

Java 带有H2 JPA的Spring boot和JUnit导致';pg#U级';找不到,java,spring,hibernate,jpa,spring-boot,Java,Spring,Hibernate,Jpa,Spring Boot,我目前有一个spring启动应用程序,它包含两个配置文件:application.yaml和application test.yaml。应用程序测试配置文件已正确加载,并且该文件中的所有设置均按预期工作 然而,我有一个特别的设置问题,那就是spring.jpa.hibernate.ddl-auto='update'。当在application.yaml文件中定义此设置时,会导致我的JPA单元测试失败,出现异常“Table”PG_CLASS“not found”。 我已尝试在应用程序测试配置文件中

我目前有一个spring启动应用程序,它包含两个配置文件:application.yamlapplication test.yaml。应用程序测试配置文件已正确加载,并且该文件中的所有设置均按预期工作

然而,我有一个特别的设置问题,那就是spring.jpa.hibernate.ddl-auto='update'。当在application.yaml文件中定义此设置时,会导致我的JPA单元测试失败,出现异常“Table”PG_CLASS“not found”。 我已尝试在应用程序测试配置文件中使用不同的值覆盖此设置,但无效

我的完整配置文件如下所示:

应用程序.yaml

#Configure Postgres backend datasource
spring.datasource.driverClassName: org.postgresql.Driver
spring.datasource.url: jdbc:postgresql://ec2-54-75-233-146.eu-west-1.compute.amazonaws.com:5432/xxxx?user=xxxx&password=xxxxx&sslmode=require
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
spring.jpa.database-platform: org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto: update
spring.datasource.usernam: sa
spring.datasource.url: jdbc:h2:mem:tests;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;DB_CLOSE_ON_EXIT=FALSE;
spring.datasource.driverClassName: org.h2.Driver
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_default: false
spring.jpa.database-platform: org.hibernate.dialect.H2
应用测试。yaml

#Configure Postgres backend datasource
spring.datasource.driverClassName: org.postgresql.Driver
spring.datasource.url: jdbc:postgresql://ec2-54-75-233-146.eu-west-1.compute.amazonaws.com:5432/xxxx?user=xxxx&password=xxxxx&sslmode=require
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
spring.jpa.database-platform: org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto: update
spring.datasource.usernam: sa
spring.datasource.url: jdbc:h2:mem:tests;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;DB_CLOSE_ON_EXIT=FALSE;
spring.datasource.driverClassName: org.h2.Driver
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_default: false
spring.jpa.database-platform: org.hibernate.dialect.H2

取消对my application.yaml文件中的“spring.jpa.hibernate.ddl-auto:update”设置的注释可以解决此问题。但我想保持启用状态。有什么想法吗?

上述错误似乎是由于Hibernate使用了错误的方言(PostgreSQL而不是H2)造成的

可以尝试在application-test.yaml中添加以下内容:

spring.datasource.driverClassName: org.h2.Driver
spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.H2Dialect

这些属性对我有用

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.hbm2ddl.auto=create

spring.datasource.usernam: sa
spring.datasource.url: jdbc:h2:mem:tests;DB_CLOSE_DELAY=-1;MODE=PostgreSQL;DB_CLOSE_ON_EXIT=FALSE;
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

spring.main.allow-bean-definition-overriding=true

在大多数情况下,您不希望在生产中启用该设置,因为生产中的数据库是通过各种实体(如DBA或支持等)进行管理的。如果您要控制数据库架构更新,请尝试集成liquibase或Flyway或类似工具进行数据库迁移,而不是依赖JPA工具