最近我开始了一个小项目,用于检查性能,方法是使用不同的配置将实体保存到数据库中。
我最终得到了3个模式。每个模式包含5个具有相同名称的表。当我尝试使用CrudRepository#findAll
或CrudRepository#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
来看,它也没有任何问题。谁能告诉我这里出了什么问题?
谢谢
答案 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
属性为您的所有实体赋予不同的名称。