当前位置: 首页 > 面试题库 >

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

叶阳
2023-03-14
问题内容

我有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无法为连接子类启用过滤器?谢谢大家…


问题答案:

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



 类似资料:
  • testFX。java: testFXController.java: 测验fxml: 当我运行testFX. java时,系统打印: 这是教授的代码,我似乎无法运行它。我意识到主要问题在代码

  • 问题内容: 我编写此代码是为了使用HTML中的元素将图像上传到本地Apache Web服务器。该记录为不为空,但为什么是完全空的? 这是我在本地网络服务器上的 将记录所有PHP文件的代码行,而不是返回的结果 问题答案: 仅记录formData对象时,它始终返回空,因为您无法记录formData。 如果您只需要在发送前对其进行记录,则可以使用它来获取formData对象中的条目

  • 问题内容: 我最近将项目升级到grails 2.3.0。一切正常,除非我每次更改代码时都遇到自动重装无法正常工作的问题。这包括所有项目人工制品- 控制器,域,服务,gsps,css和javascript文件。 我的较早版本的grails可以正常工作,并且每次进行更改时都会重新加载和重新编译。 我知道这个问题很普遍,我已经搜寻了吉拉(Jira),纳布尔(Nabble),在这里呆了好几天,但我发现没有

  • 我正在尝试集成联邦快递API并得到这个错误。 警告:SoapClient::SoapClient()[SoapClient.SoapClient]:I/O警告:无法加载测试中的外部实体“./wsdl/RateService_v13.wsdl”。php在线12 致命错误:未捕获SoapFault异常:[WSDL]SOAP-ERROR:解析WSDL:无法从'.../wsdl/RateService_v

  • 我发现了SpringData1.6.0的奇怪行为(降级的版本1.5.2没有这个问题)。这个版本似乎严格要求实体管理器工厂bean的id为“entityManagerFactory”。如果不是,则在运行TestNG测试时出现此错误: 引起原因:org.springframework.beans.factory.BeanCreation异常:创建名为'jpaMapppingContext'的bean时

  • 问题内容: 我正在尝试自动预加载模型,但是这样做很困难。 这些是我正在使用的模型: 这是我正在执行的用于测试自动预加载功能的代码: 这两个打印的输出是: 当我可以手动很好地预加载模型时,为什么通过db.First(…)获取模型不会自动预加载? 问题答案: 首先,我建议阅读文档。 这里有点解释。看来您使用旧版本的可能性更大。更新的文档说明了如何使用此标记,默认情况下将其设置为true。因此,如果您想