我有3节课:
Event
PublicEvent extends Event
PersonalEvent extends Event
我的hibernate映射文件就像下面这样。我想PersonalEvent为该对象添加一个过滤器,并在加载该对象之前启用了该过滤器。但这不起作用。我的hibernate版本是4.3.11.Final。
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无法为连接子类启用过滤器?谢谢大家…
这不是错误,而是预期的行为。我更新了《 Hibernate用户指南》以使其更加明显。
在@Filter当您直接加载实体不适用:
@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)来加载实体。