CrudRepository使用错误的表/方案来选择实体

时间:2019-06-29 12:49:12

标签: java sql spring spring-data-jpa

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

我最终得到了3个模式。每个模式包含5个具有相同名称的表。当我尝试使用CrudRepository#findAllCrudRepository#count时,会生成select,它会从错误的模式中选择数据。

这是我的带有测试的项目的确切提交,用于重现问题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来看,它也没有任何问题。谁能告诉我这里出了什么问题?

谢谢

2 个答案:

答案 0 :(得分:0)

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

  

导入com.mz.example.db.identity.entity.PrimaryTable;

并将其用作实体(通用参数),存储库将使用 PrimaryTable的定义即模式进行工作。

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

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

我认为,您不会以这种方式实现目标。 Spring-Data Repository只能使用一个实体。您有5个表和3个模式,因此需要15个存储库并使用“策略模式设计”来选择要使用哪个存储库。

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

希望对您有帮助。

答案 1 :(得分:0)

通过使用相同的简单类名称,您可以创建多个具有相同名称的实体,默认情况下,这是简单类名称。 使用name批注的@Entity属性为您的所有实体赋予不同的名称。