2

遅延フェッチするように設定されたコレクションのフェッチを JPA が拒否するという問題があります。エンティティの定義方法は次のとおりです。

レポート エンティティ

//bi-directional many-to-one association to Host
@OneToMany(mappedBy="report", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private Set<Host> hosts;

ホストエンティティ

//bi-directional many-to-one association to Report
@ManyToOne
@JoinColumn(name="INCIDENT_ID")
private Report report;

何らかの理由で、ホストをメモリにロードするように設定できず、ホストは常に null です。stackoverflow の投稿で以下を見つけましたが、どちらも機能しません。

public void loadHosts(Report report)
{
    PersistenceUtil unitUtil = getEntityManager().getEntityManagerFactory().getPersistenceUnitUtil();
    System.out.println("isLoaded(report, \"hosts\"): " + unitUtil.isLoaded(report, "hosts"));
    initializeCollection(report.getHosts());
    System.out.println("isLoaded(report, \"hosts\"): " + unitUtil.isLoaded(report, "hosts"));
}

private void initializeCollection(Collection<?> collection) 
{
    if(collection == null) 
    {
        return;
    }
    collection.iterator().hasNext();
}

上記からの出力:

SystemOut     O isLoaded(report, "hosts"): false
SystemOut     O isLoaded(report, "hosts"): false

何か案は?

4

1 に答える 1

0

session.get(object) と tx.commit の間で getHosts を呼び出す必要があると思います。または、 fetch=FetchType.EAGER を使用することもできます (ただし、これはおそらく良い考えではありません)。

于 2012-04-19T20:19:55.587 に答える