Hibernate — class level @Где аннотация не применяется к коллекциям этого класса?

#hibernate #collections #where

#спящий режим #Коллекции #where-предложение

Вопрос:

Я аннотировал объект Hibernate атрибутом @Where на уровне класса. Это ограничивает, какие объекты загружаются, когда я запрашиваю их напрямую, но, похоже, это не применяется к коллекциям этого класса. Этого следовало ожидать?

В документах это неясно: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-class

где (необязательно): указывает произвольное условие SQL WHERE, которое будет использоваться при извлечении объектов этого класса.

Мне кажется, что это применимо ко всем случаям, когда извлекаются объекты этого класса, но я заметил, что это игнорируется для коллекций.

  1. Предназначено ли это для работы с коллекциями?
  2. Если нет, то каков наилучший способ глобального применения фильтра ко всем экземплярам класса и ко всем коллекциям этого класса?

(ОБНОВЛЕНИЕ: я поднял https://hibernate.atlassian.net/browse/HHH-6781 для отслеживания проблем с документами.)

Комментарии:

1. Похоже, что это должно работать для коллекций, но если это не так, документы должны прояснить это. Я поднял hibernate.onjira.com/browse/HHH-6781

2. Я сталкиваюсь с той же проблемой, но при запросе класса напрямую через Criteria API as createCriteria(MyEntity.class).scroll() . Какой метод вы использовали в своем случае, HQL или Criteria API?

3. Я использовал критерии: list(), а не scroll() , но я бы не ожидал, что это что-то изменит.

Ответ №1:

@Where на уровне класса будет пропускать нежелательные экземпляры при использовании «GetAll» или «loadAll». Наличие @Where на уровне класса не будет «каскадно» применяться к коллекциям этого объекта.

@Где на уровне свойств коллекции общедоступный класс PuppySeller {

     @Where(clause = "status='FOR_SALE'")
    public Set<Puppy> getPuppiesForSale() {}
  

гарантирует, что при выборе «PuppySeller» из базы данных «puppiesForSale» будет заполняться только щенками со статусом «FOR_SALE».

Однако будьте очень осторожны, потому что это применимо только к коллекциям первого уровня. Я имею в виду, что, скажем, у вас есть щенок, и вы хотите выставить всех щенков на продажу у одного и того же продавца. Вы могли бы сделать что-то вроде «myPuppy.getPuppySeller().getPuppiesForSale()». Однако, если вы сделаете это, вы получите всех щенков, независимо от статуса, которые принадлежат puppySeller, включая всех щенков, которые «ПРОДАНЫ» или «НОВОРОЖДЕННЫЕ» И т. Д.

Комментарии:

1. Спасибо. Я думаю, что это в основном ошибка документации. Хотя иногда было бы полезно изменить поведение на то, что я ожидал, я думаю, что это может нарушить BC. Я поднял этот запрос, чтобы отследить исправление документа: hibernate.atlassian.net/browse/HHH-6781