2017-02-11 129 views
3

加载实体不工作时,我有3类:休眠enableFilter通过ID

  • Event
  • PublicEvent extends Event
  • PersonalEvent extends Event

我的Hibernate映射文件就像波纹管出头。我想为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); 
} 

Hibernate生成的SQL查询没有我的过滤器。我的问题是什么?为什么hibernate无法为联合子类启用筛选器? 感谢所有...

回答

2

This is not a bug, it's the intended behavior。我更新了Hibernate用户指南,使其更加明显。

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

assertNotNull(account1); 
assertNotNull(account2); 

虽然它适用,如果你使用实体查询(JPQL,HQL,标准API):

@Filter当您直接加载实体不适

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

这个问题似乎只存在于'joined-subclass' ..! –