java - 让 Hibernate 在完成实体实例后释放它们?

标签 java hibernate jpa

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

我查看了 JHAT 的堆转储,这里是有问题的类。前三个都是 Hibernate 的东西,第四个是我的 Hibernate/JPA 托管实体类。当它试图实例化 GeoEntity 的另一个实例时发生内存不足错误,我的“B”表实体:

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 

我已经检查了我的代码,我很确定我没有做任何事情,比如设置引用然后从不清除它们。事实上,我在循环结束时明确地将我使用的两个本地引用设置为 null。

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

最佳答案

所有这些都缓存在 Session/EntityManager 后面。如果您使用 Hibernate Session,则可以使用以下内容:

  • evict从 session 中删除单个实体
  • clear清除所有实例。如果程序逻辑中存在这样一个点,即不需要 session 中的任何实体。

如果再次开发 JPA API,或者他们在 EntityManager 中的对应部分:

关于java - 让 Hibernate 在完成实体实例后释放它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573379/

相关文章:

java - 为什么 Collectors.toList() 不适用于原始集合?

java - 更改交通灯java切换按钮的状态

java - 找到所需类 javax.faces.FactoryFinder 的多个版本

java - JPA/Hibernate native 查询无法识别参数

java - Hibernate将null分配给select的最后一条记录?

java - Spring 、 hibernate 、JPA : Lazy loading id's

java - 通过 Jackson 进行 JSON 重复属性验证

java - 无法构建实体管理器工厂 - JPA/Hibernate

hibernate - 在 JPA 或 HIBERNATE 中直接加入

java - Generic querydsl orderBy 带左连接的动态路径生成