一尘不染

通过ID加载实体时,Hibernate enableFilter无法正常工作

hibernate

我有3节课:

  • Event
  • PublicEvent extends Event
  • PersonalEvent extends Event

我的hibernate映射文件就像下面这样。我想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>

PersonalEventRepository

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

hibernate生成的SQL查询没有我的过滤器。我怎么了 为什么hibernate无法为连接子类启用过滤器?谢谢大家…


阅读 238

收藏
2020-06-20

共1个答案

一尘不染

这不是错误,而是预期的行为。我更新了《
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,标准API)来加载实体。

2020-06-20