完成后让Hibernate释放实体实例吗?

use*_*914 1 java hibernate jpa

我有一个简单的Java应用程序,它将记录插入表“ A”中,通过读取适当的“ B”记录,在“ A”中设置引用并保存“ A”将它们链接到另一个表“ B”中的记录。记录。我遇到的问题是Hibernate显然保留了在链接过程中读取的每个“ B”记录,这最终导致程序内存不足(堆空间错误)。

我用JHAT查看了堆转储,这是令人讨厌的类。前三个都是Hibernate的东西,第四个是我的Hibernate / JPA管理的实体类。内存不足错误发生在尝试实例化我的“ B”表实体GeoEntity的另一个实例时:

134489 instances of class org.hibernate.engine.spi.EntityKey 
67245 instances of class org.hibernate.engine.spi.EntityEntry 
67245 instances of class org.hibernate.internal.util.collections.IdentityMap$IdentityKey 
67244 instances of class com.electricgearbox.model.GeoEntity 
Run Code Online (Sandbox Code Playgroud)

我已经遍历了我的代码,并且可以确定我没有做任何事情,例如设置引用,然后再也不清除它们。实际上,我在循环末尾将两个本地引用显式设置为null。

那么,有人碰到这个吗?我确定这是我遗忘的缺少代码的行或设置,但是谷歌搜索和阅读Hibernate文档并没有提供明显的解决方案。是什么使Hibernate毫无理由地保留这些引用?

Mik*_*unu 5

所有这些都缓存在Session / EntityManager之后。如果使用Hibernate Session,则可以使用以下命令:

  • 逐出从会话中删除单个实体
  • 清除清除所有实例。如果程序逻辑中有这样的观点,则会话中不需要任何实体。

或如果再次开发JPA API,则在EntityManager中与之相对应: