Hibernate是否将Query
中提取的数据存储在persistence context
中,如果是,那么persistenceContext
将充满对象,并可能导致OutOfMemoryError?
我的假设是正确的,如果是,那么这个解决方案是什么?
答案 0 :(得分:0)
您是正确的,查询检索的所有实体都存储在持久性上下文中 - 您可以修改它们,并且它们将自动保留而不调用EntityManager.persist()
。
您可以通过调用EntityManager.clear()
来清除持久性上下文 - 这将分离所有实体。如果您不参考它们,它们最终将被垃圾收集。
但是,为了优化内存消耗,最好避免首先创建这么多实体。如果只需要实体中的某些字段,最好构建查询,以便通过构造函数映射检索普通对象而不是查询。见例:
@Entity
public class Person {
@Id
private Long id;
private String name;
}
// this is not an entity, but plain object with constructor accepting String name
package mypackage;
public class PersonName {
private String name;
public PersonName(String name) {
this.name = name;
}
}
以下查询将返回PersonName对象列表 - 未存储在持久化上下文中的普通Java对象:
select NEW mypackage.PersonName(p.name) from Person p