3

我正在使用@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
4

1 回答 1

2

避免脏检查的一种方法是指示休眠状态查询正在获取只读实体。您可以使用查询提示在 JPA 中执行此操作

q.setHint("org.hibernate.readOnly",true);

休眠文档

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

于 2013-10-08T14:38:46.783 回答