hibernate将查询结果存储在Persistence上下文中

时间:2015-10-09 13:15:47

标签: hibernate jpa persistence

Hibernate是否将Query中提取的数据存储在persistence context中,如果是,那么persistenceContext将充满对象,并可能导致OutOfMemoryError?我的假设是正确的,如果是,那么这个解决方案是什么?

1 个答案:

答案 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