当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate时EntityNotFoundException

扈瑞
2023-03-14

在我处理的一个应用程序中,我们的日志中出现了一个问题已经有一段时间了。我们认为我们最近已经解决了这个问题,但不幸的是,它仍然存在,我已经没有办法解决它了。

问题是,当我们的用户加载某个页面时,我们在后台运行JPQL/HQL查询来检索显示所需的数据。出于某种原因,此查询有时会抱怨EntityNotFoundException,但并不一致。最近从我们正在查询的表中删除了一条记录时,似乎会发生这种情况。据我所知,问题似乎是删除的记录仍在二级缓存中。我之所以认为是这样,是因为当抛出此异常时,除非手动刷新二级缓存,否则它不会消失。

堆栈跟踪在下面。在本例中,我们有一个名为“FeedPostTag”的实体,以前有一个ID为18858的FeedPostTag,但后来一些用户删除了该实体,然后当任何人尝试重新加载他们的“feed”页面(该页面将显示此FeedPostTag)时,我们会得到异常。

我们甚至尝试在删除该特定实体后立即以编程方式将其从缓存中驱逐,但这似乎也不起作用。

javax。坚持不懈EntityNotFoundException:找不到za。co.bsg公司。ems。服务器模型实体社会的组织中id为18858的FeedPostTag。冬眠jpa。靴子内部的EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate。handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:183)位于org。冬眠事件内部的DefaultLoadEventListener。在组织加载(DefaultLoadEventListener.java:219)。冬眠事件内部的DefaultLoadEventListener。org上的proxyOrLoad(DefaultLoadEventListener.java:275)。冬眠事件内部的DefaultLoadEventListener。org上的onLoad(DefaultLoadEventListener.java:151)。冬眠内部的SessionImpl。fireLoad(SessionImpl.java:1070)位于org。冬眠内部的SessionImpl。组织的内部加载(SessionImpl.java:989)。冬眠类型EntityType。位于组织的resolveIdentifier(EntityType.java:716)。冬眠类型许多单一类型。在org上组装(manytonetype.java:282)。冬眠隐藏物内部的标准QueryCache。在org上获取(StandardQueryCache.java:204)。冬眠装载机。装载机。位于org的getResultFromQueryCache(Loader.java:2481)。冬眠装载机。装载机。org上的listUsingQueryCache(Loader.java:2389)。冬眠装载机。装载机。org上的列表(Loader.java:2362)。冬眠装载机。hql。QueryLoader。org上的列表(QueryLoader.java:497)。冬眠hql。内部的ast。QueryTranslatorImpl。org上的列表(QueryTranslatorImpl.java:387)。冬眠发动机查询spi。HQLQueryPlan。performList(HQLQueryPlan.java:236)位于org。冬眠内部的SessionImpl。org上的列表(SessionImpl.java:1264)。冬眠内部的查询示例。org上的列表(QueryImpl.java:103)。冬眠jpa。内部的查询示例。org上的列表(QueryImpl.java:573)。冬眠jpa。内部的查询示例。getResultList(QueryImpl.java:449)

我不确定这是否只是Hibernate中的一个bug,或者我们是否真的在应用程序代码中出错了。任何帮助都将不胜感激。

共有1个答案

南门承教
2023-03-14

根据您所写的内容,您的数据库中似乎仍有对该记录的引用。请注意,在组装从查询缓存收集的结果时会发生此异常,因此,与FeedPostTag有多个关系的某个对象正在尝试加载不存在的记录。这不是关于Hibernate看到FeedPostTag,而是关于与该实体有关系的不同记录,Hibernate一旦需要就无法加载该记录。

org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:282) at     
org.hibernate.cache.internal.StandardQueryCache.get(StandardQueryCache.java:204) at 
org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2481) at 

请注意,将加载查询缓存中的结果,然后组装关系,最后发生异常。因此,缓存并检索了与FeedPostTag有关系的“某物”。

数据库中,检查引用了FeedPostTag的表,并检查哪个表引用了不存在的记录。比如:

select id from Tag where FeedPostTag_id = 18858;
select id from Feed where FeedPostTag_id = 18858;
select id from Post where FeedPostTag_id = 18858;
 类似资料:
  • 问题内容: 我对Hibernate的 预测 和 标准 感到困惑。何时使用投影以及何时使用标准? 问题答案: 它们不是互斥的,您可以同时使用两者。投影通常在某些条件下使用。 简而言之,使用Hibernate Projections来仅查询要使用Criteria查询的一个实体或一组实体的属性的子集。您还可以使用预测指定条款和聚合函数一样,等等。这就像指 其 数据你抓取。就像修改SQL查询中的子句一样。

  • 问题内容: 现在,我正在制作一个非常简单的网站- 大约5页。问题是,整合某种类型的数据库映射解决方案是否过时且值得花时间,或者仅使用简单的旧JNDI会更好。我可能需要从数据库中读取/写入很多东西。我想我对这些技术有基本的了解,但是仍然需要大量参考文档。还有其他人面对过这个决定吗? 编辑:抱歉,我应该指定JNDI来查找数据库连接和JDBC以执行操作。 问题答案: 简短的答案:这取决于您要支持的复杂性

  • 是否可以使用Spring数据JPA(以Hibernate作为JPA提供程序为后盾),同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,我无法使用检索当前会话。当我切换到HibernateTransaction管理器时,JPA存储库无法提交更改。 下面是Spring上下文的部分(对于该上下文,我无法使用直接的Hibernate调用): hibernate

  • 问题内容: 是否可以使用Spring Data JPA(由Hibernate作为JPA提供者支持)并同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,无法使用检索当前会话。当我切换到HibernateTransaction Manager时,JPA存储库无法提交更改。 这是我的Spring上下文的一部分(在该上下文中,我无法使用直接的Hibernate

  • 问题内容: 我正在使用Spring JPA和Hibernate的项目。可以在Spring applicationContext.xml 文件中指定 persistence.xml中的 大多数内容。 __ 那么是否还需要 persistence.xml ? 谢谢。 问题答案: 更新: Spring 3.1将支持免费的JPA配置,请参阅Spring 3.1 M2:配置增强 。 darioo的答案适合实

  • 我正在使用hibernate映射来自mysql数据库的数据。 以下是我的查询: 并得到一个错误: Apache Tomcat/7.0.23-错误报告 键入异常报告 注意可获得根本原因的完整堆栈跟踪