使用Hibernate时EntityNotFoundException

时间:2015-07-14 22:17:35

标签: java hibernate

在我正在处理的应用程序上,我们已经在我们的日志中遇到了一个问题已经有一段时间了。我们认为我们最近已经解决了这个问题,但不幸的是它仍然存在,而且我已经没有关于如何修复它的想法。

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

堆栈跟踪如下。在这个例子中,我们有一个名为“FeedPostTag”的实体,曾经有一个ID为18858的FeedPostTag,但是有些用户删除了那个,然后当有人试图重新加载他们的“Feed”页面时会显示这个FeedPostTag,我们得到了异常。

我们甚至尝试以编程方式将这个特定实体从缓存中删除后直接删除它,但这似乎也没有用。

  

javax.persistence.EntityNotFoundException:无法找到   za.co.bsg.ems.server.model.entity.social.FeedPostTag,内容为id 18858 at   org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:183)   在   org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219)   在   org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275)   在   org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151)   在org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)   在   org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:989)   在   org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)   在org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:282)   在   org.hibernate.cache.internal.StandardQueryCache.get(StandardQueryCache.java:204)   在   org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2481)   在org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2389)   在org.hibernate.loader.Loader.list(Loader.java:2362)at   org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)at at   org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)   在   org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)   在org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)at   org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)at   org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)at at   org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)

我不确定这只是Hibernate中的一个错误,还是我们在应用程序代码中实际上做错了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据您撰写的内容,您似乎仍然在数据库中引用此记录。请注意,在汇总从查询缓存中收集的结果时会发生此异常,因此,与ManyToOne具有FeedPostTag关系的内容正在尝试加载不存在的记录。它不是关于FeedPostTag被Hibernate看到的,而是关于与该实体有关系的不同记录,一旦需要就无法通过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;