Java 按id加载实体时,Hibernate enableFilter不工作

Java 按id加载实体时,Hibernate enableFilter不工作,java,hibernate,orm,nhibernate-mapping,hibernate-filters,Java,Hibernate,Orm,Nhibernate Mapping,Hibernate Filters,我有三门课: 事件 PublicEvent扩展事件 PersonalEvent扩展事件 我的hibernate映射文件类似于bellow。我想为PersonalEvent添加一个过滤器,在加载此对象之前,我启用了该过滤器。但这是行不通的。我的hibernate版本是4.3.11.Final Event.hbm.xml <hibernate-mapping> <class name="org.calendar.Event"> ...

我有三门课:

  • 事件
  • PublicEvent扩展事件
  • PersonalEvent扩展事件
我的hibernate映射文件类似于bellow。我想为
PersonalEvent
添加一个过滤器,在加载此对象之前,我启用了该过滤器。但这是行不通的。我的hibernate版本是
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>
hibernate生成的SQL查询没有我的筛选器。我有什么问题?为什么hibernate不能为加入的子类启用筛选器? 谢谢大家……

。我更新了Hibernate用户指南,使其更加明显

直接加载实体时,
@过滤器
不适用:

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

assertNotNull( account1 );
assertNotNull( account2 );
当您使用实体查询(JPQL、HQL、Criteria API)时,它适用:


因此,作为一种解决方法,使用实体查询(JPQL、HQL、Criteria API)加载实体。

这个问题似乎只存在于
连接的子类中。
。。!
Account account1 = entityManager.find( Account.class, 1L );
Account account2 = entityManager.find( Account.class, 2L );

assertNotNull( account1 );
assertNotNull( account2 );
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();
}