加载与Hibernate Envers的ManyToOne关系 - 渴望/懒惰?

时间:2016-04-24 06:51:49

标签: java hibernate jpa database-performance hibernate-envers

我使用Hibernate Envers 4.3.10.Final。 我有以下两个JPA课程:

public class Factory {
     private int factoryID;
     .... 
}

public class Trgs{
     private int trgsID;

     @ManyToOne(fetch=FetchType.EAGER)
     @JoinColumn(name="fk_factory")
     private Factory factory;
}

我写了一个返回所有Audited Trgs对象的方法。

方法是:

public List<Trgs> readAuditedTrgs (List<Integer> trgsIds) {
      AuditReader reader = AuditReaderFactory.get(entityManager);
      AuditQuery query = reader.createQuery().forRevisionsOfEntity(Trgs.class, true, true);

      query.add(AuditEntity.id().in(ids));
      query.add(AuditEntity.revisionType().eq(RevisionType.ADD));
      query.addOrder(AuditEntity.revisionNumber().desc());
      return  query.getResultList() ;
}

执行上述方法后,我的结果是审核后的Trgs列表。每个Trgs对象当然都有正确且相关的审计工厂对象。

但问题是,我已经知道Hibernate Envers总是加载Relation LAZY。

所以在我的案例中,我必须遍历Trgs列表并初始化每个工厂对象。

 for (Trgs trgs : resultList) {
      Hibernate.initialize(trgs.getFactory());
    }

因此,如果我有300个Trgs对象,我必须初始化300个工厂对象。这花费太多了。我得等一分钟。

我了解到无法热切地加载工厂对象。但我需要另一种解决方案。我在Dashboad站点(Web项目)中显示此数据。在加载数据之前,用户不能等待一分钟。

请帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:1)

Envers AuditQuery API可以使用许多改进,这可能是其自身缺点的一个很好的例子。我已将HHH-11479添加到JIRA以跟踪此功能。