Спящие именованные запросы - PullRequest
0 голосов
/ 18 января 2011

В hibernate, когда мы делаем, session.getNamedQuery (QUERY_NAME), нам не нужно передавать имя файла hbm.xml, где хранится именованный запрос. Имя файла hbm.xml упоминается в файле cfg.

Вопрос в том, что если для именованных запросов имеется 5 файлов hbm.xml и существует конфликт имен по отношению к имени запроса (т. Е. Одно и то же QUERY_NAME во всех 5 файлах), как hibernate разрешит его?

Интуитивно понятно, что он появляется перед выполнением session.getNamedQuery (QUERY_NAME), необходимо явно загрузить конкретный файл hbm.xml, в который написан запрос.

Ответы [ 3 ]

1 голос
/ 18 января 2011

Hibernate агрегирует все именованные запросы по всему загруженному файлу hbm в одном логическом пространстве имен (представьте его как карту с именем в качестве ключа, но с двойной проверкой ключа перед положением (..)).Таким образом, имена должны быть уникальными для данной фабрики сеансов.Поэтому убедитесь, что все ваши именованные запросы уникальны.

0 голосов
/ 19 января 2011

Хотя это напрямую не решает вопрос, обычной практикой является давать вашим запросам имена, которые отражают пакет и сущность, с которой они имеют дело, чтобы избежать коллизий имен. Вместо «findUser» у вас может быть что-то вроде «com.myproject.domain.User.findByUsernameAndPassword»

0 голосов
/ 18 января 2011

В дополнение к ответу Pangea: если вы хотите иметь разные версии одного и того же запроса в разных .hbm.xml файлах и выбирать между ними, вы можете сделать это, вызвав Configuration.addFile() / Configuration.addInputStream() при построении SessionFactory (хотя это может быть сделано только один раз во время инициализации SessionFactory, чтобы вы не могли изменить их на лету).

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