我正在使用@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
答案 0 :(得分:2)
避免脏检查的一种方法是指示休眠该查询正在获取只读实体。您可以使用query hints
在JPA中执行此操作q.setHint("org.hibernate.readOnly",true);
org.hibernate.readOnly :此查询检索的实体将以只读模式加载,其中Hibernate永远不会对它们进行脏检查或使更改持久化(例如,new Boolean(true) ),默认为false