2017-02-11 6 views
3

У меня есть 3 класса:Hibernate enableFilter не работает при загрузке объект по идентификатору

  • Event
  • PublicEvent extends Event
  • PersonalEvent extends Event

мое отображение файла спящего режима является нечто вроде приведенных ниже. Я хочу добавить один фильтр для PersonalEvent, и перед загрузкой этого объекта я был включен этот фильтр. но это не работает. моя версия спящего режима - 4.3.11.Final.

Event.hbm.xml

<hibernate-mapping> 
    <class name="org.calendar.Event"> 
     ... 
     <filter name="personalEventAuthorize" condition="person_ID = :personId" /> 
    </class> 
    <joined-subclass name="org.calendar.PersonalEvent" extends="org.calendar.Event"> 
     <key column="id" property-ref="id" /> 
     ... 
     <many-to-one name="person" column="person_ID" entity-name="org.person.Person" /> 
    </joined-subclass> 
    <joined-subclass name="org.calendar.PublicEvent" extends="org.calendar.Event"> 
     <key column="id" property-ref="id" /> 
     ... 
    </joined-subclass> 
    <filter-def name="personEventAuthorize"> 
     <filter-param name="personId" type="integer" /> 
    </filter-def> 
</hibernate-mapping> 

PersonalEventRepository

@Override 
public PersonalEvent load(Long id) { 
    Filter filter = getSession().enableFilter("personEventAuthorize"); 
    filter.setParameter("personId", getAuthenticatedPersonId()); 
    return super.loadById(id); 
} 

зимуют генерируется SQL-запрос без моего фильтра. в чем моя проблема? почему hibernate не может включить фильтр для объединенного подкласса? благодарит для всех ...

ответ

2

This is not a bug, it's the intended behavior. Я обновил руководство пользователя Hibernate, чтобы сделать его более очевидным.

@Filter не применяется при загрузке объект непосредственно:

Account account1 = entityManager.find(Account.class, 1L); 
Account account2 = entityManager.find(Account.class, 2L); 

assertNotNull(account1); 
assertNotNull(account2); 

Хотя это применяется, если вы используете сущности запроса (JPQL, HQL, критерии API):

Account account1 = entityManager.createQuery(
    "select a from Account a where a.id = :id", 
    Account.class) 
    .setParameter("id", 1L) 
.getSingleResult(); 
assertNotNull(account1); 
try { 
    Account account2 = entityManager.createQuery(
     "select a from Account a where a.id = :id", 
     Account.class) 
    .setParameter("id", 2L) 
    .getSingleResult(); 
} 
catch (NoResultException expected) { 
    expected.fillInStackTrace(); 
} 

Итак, как обходной путь, используйте запрос объекта (JPQL, HQL, Criteria API) для загрузки объекта.

+0

спасибо за повтор. в настоящее время я использую этот подход. –

+0

эта проблема кажется просто существует в 'join-subclass' ..! –

Смежные вопросы