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

标签 java hibernate jpa

我正在为纯只读的@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/

相关文章:

java - 从选择 ul 获取文本

java - NFC 读卡器和 Android 手机

java - 在 Hibernate 中同时使用@Column 和@Formula

java - Wicket - 哪个ORM?

java - 静态与新对象

java - 长时间运行的 activiti 服务任务

java - Hibernate native SQL 查询

java - 使用 hibernate 以编程方式验证架构

java - hibernate 中的 ColumnTransformer

java - 使用 TIMESTAMPDIFF 的 JPA Hibernate 公式中的 SQL 文字