CrudRepository использует неверную таблицу / схему для выбора сущностей - PullRequest
1 голос
/ 29 июня 2019

Недавно я запустил небольшой проект для проверки производительности с сохранением сущностей в базе данных с использованием различных конфигураций.

В итоге я получил 3 схемы.Каждая схема содержит 5 таблиц с одинаковыми именами.Когда я пытаюсь использовать CrudRepository#findAll или CrudRepository#count, генерируется select, который выбирает данные из неверной схемы.

Вот точный коммит для моего проекта с тестом для воспроизведения проблемы https://github.com/hawk1234/spring-boot-db-performance/commit/7176664cfc87ee7d04b84a6d7ef7e4a77d87730a test 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 голосов
/ 01 июля 2019

Используя одно и то же простое имя класса, вы создаете несколько сущностей с одинаковым именем, которое по умолчанию является простым именем класса.Используйте атрибут name аннотации @Entity, чтобы дать разные имена всем вашим сущностям.

0 голосов
/ 30 июня 2019

Поскольку ваш PrimaryTableRepository импортирует PrimaryTable (идентификатор)

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

и используя его как Entity (универсальный аргумент) , хранилище будет работать с определением PrimaryTable т.е. схемой.

Как вы уже упоминали, вы комментируете любую PrimaryTable , но ту, которую хотите использовать. Вы, вероятно, получили ошибку компиляции и (повторно) импортировали правильный класс в репозиторий , т.е. one_to_one.

Если вы используете Eclipse, другой возможный вариант, если вы не отметили «Автоматически строить» на вкладке «Проект» и работали с более старой версией или вашим кодом.

По-моему, вы не достигнете своей цели таким образом. Spring-Data Repositories работает с одним и только одним объектом. У вас есть 5 таблиц и 3 схемы, поэтому вам нужно 15 репозиториев и использовать стратегический шаблон, чтобы выбрать, какой репозиторий использовать.

Другим лучшим вариантом является указание схемы в строке подключения. В этом случае вам понадобится всего 5 сущностей и 5 хранилищ для доступа к вашим данным. Я не эксперт в gradle, но в maven вы можете заменить часть вашей конфигурации, используя maven-resource-plugin и profile, чтобы установить подходящую строку подключения.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...