2016-04-24 11 views
4

私はHibernate Envers 4.3.10.Finalを使用します。 は、私は、以下の2つのJPA-のクラスを持っている:Hibernate EnversとのManyToOne関係のロード - Eager/Lazy?

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

public class Trgs{ 
    private int trgsID; 

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

私は、すべての監査済Trgsオブジェクトretuns方法を書きました。

方法は次のとおりです。

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オブジェクトはもちろん、正確で関連性のあるAudited Factoryオブジェクトを持っています。

しかし、問題は、私は、Hibernate Enversが常に関係LAZYをロードすることを学んだことです。

私のケースでは、Trgs Listを繰り返し処理し、各Factoryオブジェクトを初期化する必要があります。

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

たとえば、300個のオブジェクトがある場合、300個のファクトリオブジェクトを初期化する必要があります。そしてそれは多くの費用がかかる。私は1分待たなければならない。

私は、Factoryオブジェクトを熱心に読み込むことはできないことを知りました。しかし、私は他の解決策が必要です。このデータをDashboadサイト(Webプロジェクト)に表示します。ユーザーは、データがロードされるまで1分間待つことはできません。

この問題を解決するために私を助けてください。ありがとう。

+0

フェッチタイプを熱心に言及している場合は、すぐに読み込む必要があります。あなたはそれが怠け者に変わったら、上記のことが起こるかどうか尋ねていますか? – LearningPhase

+0

No. Hibernate Enversのドキュメントでは、FetchTypeが宣言されていても関係は常にLAZYであると説明されています。だから私の場合、私はFactory Object Eagerを宣言しましたが、EnverはFactory Lazyをロードします。あなたは私の説明を理解していますか? –

+0

固定されていないことを示す休止状態の問題があります:(https://hibernate.atlassian.net/browse/HHH-3552 – destan

答えて

1

Envers AuditQuery APIが使用できるいくつかの改善点があります。これは、それ自体の短所の良い例です。この機能を追跡するために、JIRAにHHH-11479を追加しました。

関連する問題