代码之家  ›  专栏  ›  技术社区  ›  Omkar Shetkar

与Spring Data Jdbc的多对多关系

  •  0
  • Omkar Shetkar  · 技术社区  · 5 年前

    我有一个使用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 我认为这样可以避免歧义。

    这个 似乎 就像Spring Boot 2.3.0中包含的Spring Data JDBC版本的错误一样。有人能确认这是一个错误,或者建议对我的演示项目进行与Boot 2.3.0兼容的更改吗?

    提前感谢您的任何建议或讨论!

    0 回复  |  直到 5 年前
        1
  •  4
  •   mrgrew    5 年前

    看来我问得太快了。。。就在我问这个问题的同一天,一本迁移指南出版了! https://spring.io/blog/2020/05/20/migrating-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 工作版本的分支。

    谢谢你的轻推 Jens Schauder !