我有一个简单的 Java 应用程序,它将记录插入表“A”,通过读取适当的“B”记录将它们链接到另一个表“B”中的记录,在“A”中设置引用,并保存“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 无缘无故地持有这些引用?