我可以从EntityManager自动分离SqlResultSetMapping实体吗?

时间:2013-10-08 13:48:46

标签: java hibernate jpa

我正在使用@SqlResultSetMapping作为@Entity纯粹只读(并且在数据库中没有支持表)。我正在将数万个这些加载到内存中,所以我需要从EntityManager中分离实体,以避免在我以后工作时Hibernate的脏实体检查。

是否有办法注释实体或SqlResultSetMapping,以便实体永远不会添加到EntityManager中?

非持久性实体:

@SqlResultSetMapping(name = "fooMapping", entities = @EntityResult(entityClass = Foo.class))
@Entity
public class Foo {
    @Id
    public Long row_id;
    public String name;
}

原生查询:

String sql = "SELECT id AS row_id, friendlyName AS name FROM SomeTable"; 
Query q = JPA.em().createNativeQuery(sql, "fooMapping");
List<Foo> fooList = q.getResultList();

目前的解决方案:

for (Foo f : fooList) {
    JPA.em().detach(f); // 100x improvement for subsequent DB work
}

// subsequent database work

1 个答案:

答案 0 :(得分:2)

避免脏检查的一种方法是指示休眠该查询正在获取只读实体。您可以使用query hints

在JPA中执行此操作
q.setHint("org.hibernate.readOnly",true);

来自hibernate doc

  

org.hibernate.readOnly :此查询检索的实体将以只读模式加载,其中Hibernate永远不会对它们进行脏检查或使更改持久化(例如,new Boolean(true) ),默认为false