Hibernate-为什么调试日志中有多个重复的select语句?

Hibernate-为什么调试日志中有多个重复的select语句?,hibernate,jsf,jpa,primefaces,entitymanager,Hibernate,Jsf,Jpa,Primefaces,Entitymanager,服务方法返回如下所示的对象 return entityManager.find(Event.class, id); @viewscope bean的内部 事件对象大约有40个字段,其中一些被映射到@manytoman 当我使用JavaScript打开PrimeFaces对话框时,Hibernate运行它用于生成初始页面的所有查询。每当我在调用bean的页面上执行任何操作时,Hibernate都会再次运行所有查询。不仅如此,同样的SELECT查询在日志中重复了几十次。我已经尝试过将FetchTy

服务方法返回如下所示的对象

return entityManager.find(Event.class, id);
@viewscope bean的内部

事件对象大约有40个字段,其中一些被映射到@manytoman

当我使用JavaScript打开PrimeFaces对话框时,Hibernate运行它用于生成初始页面的所有查询。每当我在调用bean的页面上执行任何操作时,Hibernate都会再次运行所有查询。不仅如此,同样的SELECT查询在日志中重复了几十次。我已经尝试过将FetchType从渴望更改为懒惰,然后再更改,没有任何更改。我尝试从持久性上下文中分离对象,但是没有加载我的惰性集合。经过彻底的谷歌搜索,我找不到任何相关的问题。此外,Hibernate实际上并没有抛出异常,它只是运行得很慢,因为它在将信息加载到内存后不必要地查询数据库

我在想,在这一过程中,有一些简单的事情我做得不对,我希望StackOverflow的优秀员工能够为我指明正确的方向,有人吗


如果我没有在这里提供足够的信息,请询问我任何可能有助于解决方案的相关数据。

服务器端没有任何内容会导致hibernate缓存它检索到的内容。因此,对服务器的每个请求都将导致hibernate检索相关对象。如果您想减少这种情况,可以使用二级缓存。然后将缓存PK的检索


请记住,在集群中使用二级缓存时需要集群缓存解决方案。

我只向服务器发出一个请求。打电话给我的全部愤怒者去寻找目标。find返回的对象填充在整个视图中使用的bean中。我不再对数据库进行任何调用,因此我认为在幕后有某种Hibernate机制在暗指我。那么所有的多个Hibernate调用都发生在对服务器的同一个HTTP调用中?在这种情况下,您的会话不是请求作用域,而是作为某个bean中的一个较小的作用域。我的会话是ViewScope,这意味着在我最初调用find将对象从数据库中取出后,Hibernate不必进行任何其他查询,只需检索惰性集合。但是,即使我用JavaScript打开PrimeFaces对话框,Hibernate对数据库的调用也与它在初始查找时的调用相同。我甚至试着把bean放到SessionScope中,但没有任何效果。