我有一个使用 Spring Data JDBC 的 Spring Boot 项目。测试使用 HSQLDB。当我尝试升级到 Spring Boot 2.3.0 时,我的存储库测试开始失败。
Spring Data JDBC 现在似乎引用表名和列名。 Spring Boot 2.2.7 附带的 Spring Data JDBC 版本没有。
该项目位于https://github.com/mrgrew/boot230bug展示了差异。 Spring Boot 2.3.0 生成INSERT INTO "stats.counter" ("COUNTER_NAME") VALUES (?)
这失败了。 Spring Boot 2.2.7 生成INSERT INTO stats.counter (counter_name) VALUES (?)
成功了。
我猜测 Spring Data JDBC 没有正确识别方言。我的测试属性指定spring.datasource.platform=hsqldb
我认为这可以避免歧义。
This seems就像 Spring Boot 2.3.0 中包含的 Spring Data JDBC 版本的错误一样。任何人都可以确认这是一个错误或建议对我的演示项目进行更改以使用 Boot 2.3.0 吗?
预先感谢您的任何建议或讨论!
看来我问得太快了...在我问这个问题的同一天就发布了迁移指南!https://spring.io/blog/2020/05/20/migration-to-spring-data-jdbc-2-0
迁移指南解释了我所观察到的情况:
引用标识符
Spring Data JDBC 1.x 主要使用表名和列名而不更改它们。当您使用 SQL 关键字作为属性或实体名称或尝试在列名称中使用某些特殊字符时,这会导致问题。
因此,Spring Data JDBC 2.0 默认引用所有标识符。这使得名称区分大小写,至少对于大多数数据库来说是这样。由于默认情况下我们还将生成的名称转换为数据库使用的默认字母大小写,因此假设您像大多数人一样在 CREATE TABLE 语句中没有使用引号,这不会导致任何问题。
从 Liquibase 更改日志中删除 @Table 注释和 schemaName 消除了我无意中使用的引用并解决了问题。作为奖励,我不再需要创建架构,因此我可以删除spring.datasource.platform=hsqldb
和 schema-hsqldb.sql 文件。请参阅fixed工作版本的分支。
谢谢你的轻推延斯·肖德!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)