MEM数据库中的H2在较低情况下生成数据库表名称,但是当从数据插入数据时,将表名称转换为上库
我有一个 spring boot
带有不同数据库的 dev
(mysql)
和 test
test (H2 in内存)
。我还有两个 data.sql
文件,这些文件配置为 dev
和 test
profiles。
在 test
中,当 Hibernate
创建数据库表时,它使用较低的表名称。在数据库创建之后,App试图用 insert
查询 data-test.sql
文件填充数据库,它在upper_case中寻找表格和失败:
Hibernate create table sql:
create table "activity_domain" (...)
data-test.sql:
INSERT INTO activity_domain (title) VALUES ('Activity Domain One');
Error message:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ACTIVITY_DOMAIN" not found (candidates are: "activity_domain"); SQL statement:
INSERT INTO activity_domain (title) VALUES ('Activity Domain One') [42103-212]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) DbException.java:502
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) DbException.java:477
at org.h2.message.DbException.get(DbException.java:223) DbException.java:223
at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8379) Parser.java:8379
at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8347) Parser.java:8347
at org.h2.command.Parser.readTableOrView(Parser.java:8336) Parser.java:8336
at org.h2.command.Parser.readTableOrView(Parser.java:8306) Parser.java:8306
at org.h2.command.Parser.parseInsert(Parser.java:1641) Parser.java:1641
at org.h2.command.Parser.parsePrepared(Parser.java:814) Parser.java:814
at org.h2.command.Parser.parse(Parser.java:691) Parser.java:691
at org.h2.command.Parser.parse(Parser.java:661) Parser.java:661
at org.h2.command.Parser.prepareCommand(Parser.java:568) Parser.java:568
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) SessionLocal.java:631
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) SessionLocal.java:554
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) JdbcConnection.java:1116
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237) JdbcStatement.java:237
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223) JdbcStatement.java:223
at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261)
更多信息:
application:application:
application。 .properties
用于测试配置文件:
spring.datasource.url=jdbc:h2:mem:my-test-db;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.defer-datasource-initialization=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.sql.init.data-locations=classpath:data-test.sql
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
database_to_upper = false
是一种仅适用于非常旧版本的H2数据库的选项。它以不同的方式与现代版本一起工作,并有效地使所有标识符案例敏感。它不再启用案例不敏感的标识符,而是由其他选项控制的。使用现代版本,如果您需要与MySQL具有一定的兼容性,则需要添加
; mode = mysql; database_to_lower = true
而不是。您也可能需要; CASE_INSENSIDIS_IDDICIER = TRUE
,请参阅模式详细信息的兼容模式文档:https://h2database.com/html/features.html#compatibility
DATABASE_TO_UPPER=FALSE
is an option suitable only for very old versions of H2 Database. It works in different way with modern versions and it effectively makes all identifiers case sensitive. It doesn't enable case insensitive identifiers any more, they are controlled by another option.With modern versions if you need to have some compatibility with MySQL you need to add
;MODE=MySQL;DATABASE_TO_LOWER=TRUE
instead. You may also need;CASE_INSENSITIVE_IDENTIFIERS=TRUE
, see documentation of compatibility modes for mode details:https://h2database.com/html/features.html#compatibility