[英]Issues in Spring Boot with Hibernate using H2 for testing simulating PostgreSQL
我在運行 spring 啟動測試時遇到問題,該測試正在模擬postgresql
的h2
數據庫。
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select currencyen0_.currency as currency1_0_0_, currencyen0_.isBaseCurrency as isbasecu2_0_0_ from currency currencyen0_ where currencyen0_.currency=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
-----
-----
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "currencyen0_.isbasecurrency" not found; SQL statement:
select currencyen0_.currency as currency1_0_0_, currencyen0_.isBaseCurrency as isbasecu2_0_0_ from currency currencyen0_ where currencyen0_.currency=? [42122-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:453)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:163)
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:145)
at org.h2.expression.Alias.optimize(Alias.java:52)
at org.h2.command.dml.Select.prepare(Select.java:1206)
at org.h2.command.Parser.prepareCommand(Parser.java:744)
at org.h2.engine.Session.prepareLocal(Session.java:657)
at org.h2.engine.Session.prepareCommand(Session.java:595)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:352)
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
為什么列"currencyen0_.isbasecurrency"
丟失了? 我的實體currency
確實定義了此列。
我的測試屬性看起來像這樣。
spring:
output.ansi.enabled: ALWAYS
jpa:
# Tried 1 : workaround org.hibernate.dialect.H2Dialect
# Tried 2 : org.hibernate.dialect.PostgreSQL95Dialect
database-platform: org.hibernate.dialect.PostgreSQLDialect
generate-ddl: true
hibernate.ddl-auto: create
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
id.new_generator_mappings: false
format_sql: true
datasource:
driverClassName: org.h2.Driver
# Tried 3 :these additional settings DATABASE_TO_LOWER=TRUE;MODE=PostgreSQL;
url: jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1;
如果您使用 H2 DB 那么您是否必須使用 H2 方言?
不幸的是我無法重現你的錯誤。 請嘗試將您的實體添加到帖子中。
另一種方法是使用 TestContainers 來模擬 postgres。 我想把這個食譜包括在內作為記錄。
注意:運行 TestContainers 需要 Docker。
application.yml
看起來像:
spring:
flyway:
locations: classpath:db/migration
datasource:
driver-class-name: org.postgresql.Driver
username: postgres
password:
url: jdbc:postgresql://localhost:5432/test
您可以將 flyway 更改為您喜歡的其他遷移工具。
application-test.yml
看起來像:
spring:
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:postgresql:11.1///test
jpa:
database-platform: org.hibernate.dialect.PostgreSQL9Dialect
hibernate:
ddl-auto: validate
pom.xml
應該包含以下依賴項:
<properties>
<org.testcontainers.version>1.12.5</org.testcontainers.version>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${org.testcontainers.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>${org.testcontainers.version}</version>
<scope>test</scope>
</dependency>
...
</dependencies>
測試應如下所示:
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class TestcontainerApplicationTests {
@Autowired
UserRepository userRepository;
@Test
void contextLoads() {
User user = new User();
user.setName("test");
userRepository.save(user);
}
}
此代碼片段將添加 TestContainer。 它將在docker中運行PostgreSQL數據庫。希望對某人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.