java - CrudRepository 使用不正确的表/模式来选择实体

标签 java sql spring spring-data-jpa

最近我启动了一个小项目,用于检查性能,使用不同的配置将实体保存到数据库中。

我最终得到了 3 个模式。每个模式包含 5 个同名的表。当我尝试使用 CrudRepository#findAllCrudRepository#count 时,会生成从不正确的架构中选择数据的选择。

这是我的项目的确切提交,并进行了重现问题的测试 https://github.com/hawk1234/spring-boot-db-performance/commit/7176664cfc87ee7d04b84a6d7ef7e4a77d87730a测试IdentityTest#testSave

例如对于 CrudRepository#count 我得到:

select
        count(*) 
    from
        PrimaryTable x */ select
            count(*) as col_0_0_ 
        from
            one_to_one.primary_table primarytab0_

当我评论所有 PrimaryTable 实体并仅保留正确架构(即 IDENTITY_SCHEMA)中的一个实体时,我将在应用程序日志中获得正确的选择

select
        count(*) 
    from
        PrimaryTable x */ select
            count(*) as col_0_0_ 
        from
            identity_schema.primary_table primarytab0_

据我观察,CrudRepository#findById 工作没有任何问题。谁能告诉我这里出了什么问题吗?

谢谢

最佳答案

由于您的PrimaryTableRepository正在导入PrimaryTable(身份)

import com.mz.example.db.identity.entity.PrimaryTable;

并将其用作实体(通用参数),存储库将使用PrimaryTable 的定义,即架构。

正如您之前提到的,您正在注释任何PrimaryTable,但您要使用的除外。您可能遇到编译错误,并在您的存储库中(重新)导入了正确的类,即 one_to_one。

如果您使用的是 Eclipse,如果您尚未选中“项目”选项卡下的“自动构建”并且您运行的是旧版本或您的代码,则还有另一个可能的选择。

在我看来,这样你不会达到你的目标。 Spring-Data Repositories 与一个且仅一个实体一起工作。您有 5 个表和 3 个架构,因此需要 15 个存储库,并使用策略模式设计来选择要使用的存储库。

另一个更好的选择是在连接字符串中指定架构。在这种情况下,您只需要 5 个实体和 5 个存储库来访问您的数据。我不是 gradle 方面的专家,但在 Maven 中,您可以使用 maven-resource-plugin 和配置文件替换部分配置,以设置适当的连接字符串。

希望对您有所帮助。

关于java - CrudRepository 使用不正确的表/模式来选择实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56817669/

相关文章:

java - 将 Jetty 线程池的一部分专用于特定端点

java - 如何通过游标获取android中的Timestamp列值?

mysql - 在 In MySql 中与 Intellij 和 H2 一起使用 SQL 安全调用程序时出现 JdbcSQLException?

Mysql 查询获取酒店预订房间的未预订日期

java - 得到错误 org.springframework.beans.factory.NoSuchBeanDefinitionException : No bean named 'springSecurityFilterChain' is defined

java - 解释 Java 类文件中十六进制值的访问标志

java - 类型不兼容和 System.out.print 错误?

java - 使用 Split 方法创建分词器

java - 使用 spring 表单在 spring mvc 中上传文件不起作用

java - 我可以使用spring进行幂等注入(inject)吗?