MEM数据库中的H2在较低情况下生成数据库表名称,但是当从数据插入数据时,将表名称转换为上库

发布于 2025-02-09 18:14:59 字数 3063 浏览 1 评论 0 原文

我有一个 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

I have a Spring Boot project with different databases for dev (MySQL) and test (H2 in memory). I also have two data.sql files configured for dev and test profiles.
In test when Hibernate creates database tables, it uses lower-case table names. After database creation, app tries to fill database with insert queries inside data-test.sql file, it looks for tables in UPPER_CASE and failes:

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)

More info:

application.properties for test profile:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

聚集的泪 2025-02-16 18:15:00

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文