1

テーブル「A」にレコードを挿入し、適切な「B」レコードを読み取り、「A」に参照を設定し、「A」を保存することで、レコードを別のテーブル「B」のレコードにリンクする単純なJavaアプリがあります。記録。私が抱えている問題は、Hibernateがリンクプロセス中に読み取るすべての「B」レコードを保持しているように見えることです。これにより、最終的にプログラムのメモリが不足します(ヒープスペースエラー)。

JHATでヒープダンプを調べました。これが問題のあるクラスです。上位3つはすべてHibernateのもので、4つ目は私の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に使用する2つのローカル参照を明示的に設定しています。

それで、誰かがこれに遭遇しましたか?コードの行が欠落しているか、設定を忘れていることは確かですが、グーグルでHibernateのドキュメントを読んでも、明らかな解決策はありません。明白な理由なしに、Hibernateがこれらの参照を保持する理由は何ですか?

4

1 に答える 1

5

これらはすべて、Session/EntityManagerの背後にキャッシュされます。Hibernate Sessionを使用する場合は、以下を使用できます。

  • evictはセッションから単一のエンティティを削除します
  • クリアすべてのインスタンスをクリアします。プログラムロジックに、セッション内のエンティティが不要になるようなポイントがある場合。

または、JPA APIを再度開発する場合は、EntityManagerの対応するもの:

于 2012-05-13T16:54:44.960 に答える