我正在为纯只读的@Entity
使用@SqlResultSetMapping
(并且在数据库中没有支持表)。我正在将数以万计的实体加载到内存中,因此我需要将实体与 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
最佳答案
避免脏检查的一种方法是向 hibernate 指示查询正在获取只读实体。您可以在 JPA 中使用 query hints 执行此操作
q.setHint("org.hibernate.readOnly",true);
来自 hibernate doc :
org.hibernate.readOnly : Entities retrieved by this query will be loaded in a read-only mode where Hibernate will never dirty-check them or make changes persistent ( eg. new Boolean(true) ), default to false
关于java - 我可以从 EntityManager 自动分离 SqlResultSetMapping 实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249532/