我有一个简单的 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,则可以使用以下内容:
如果再次开发 JPA API,或者他们在 EntityManager 中的对应部分:
关于java - 让 Hibernate 在完成实体实例后释放它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573379/