使用H2 JPA的Spring启动和JUnit导致找不到'pg_class'

时间:2016-10-04 10:48:43

标签: java spring hibernate jpa spring-boot

我目前有一个Spring启动应用程序,其中包含2个配置文件: application.yaml application-test.yaml 。正确加载应用程序测试配置文件,该文件中的所有设置都按预期工作。

但是我遇到一个问题,特别是spring.jpa.hibernate.ddl-auto ='update'。当在 application.yaml 文件中定义此设置时,它会导致我的JPA单元测试失败,并显示“表”PG_CLASS“未找到”异常。 我尝试在应用程序测试配置文件中使用不同的值覆盖此设置,但无济于事。

我的完整配置文件如下:

application.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

应用test.yaml

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

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

2 个答案:

答案 0 :(得分:2)

上述错误似乎是由Hibernate使用错误的方言(PostgreSQL而不是H2)引起的。

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

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

答案 1 :(得分:0)

这些属性对我有用。

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