1

私の問題は比較的単純です:

私は常に必要としない多くの遅延ロードされたセットを持つエンティティを持っています。今、私はすべてを熱心にロードしたくはありませんし、いくつかの異なる getSlimEntity()、getFullEntity()、getEntityForSpecialOccasion() メソッドを持ちたくもありません。

私がやりたいのは、デフォルトで「スリム」バージョンを用意してから、レイジーなものをオンデマンドでロードすることです。その要求は、「タスク」エンティティを表示する Web ページのタブを変更することで発生する可能性があります。新しいタブにタスクの履歴が表示されます。ただし、このタブはあまり使用されないため、データを熱心に取得する必要はありません。

データベースのパフォーマンスは私たちにとって問題であるため、解決策はデータベースにできるだけ労力をかけないようにする必要があります。

私が思いついた解決策は、Session.buildLockRequest() を使用してタスクを EntityManager に「再アタッチ」し、必要なセットで Hibernate.initialize() を呼び出すことです。次のようになります。

public Set<HistoryEntry> getHistory(Task task) {

    Session session = manager.unwrap(Session.class);
    session.buildLockRequest(LockOptions.NONE).lock(task);

    Hibernate.initialize(task.getHistory());

    return task.getHistory();
}

これはスリムで比較的理解しやすいソリューションであり、データベースは更新されず、問題の HistoryEntries を照会するだけです。

ここで私の質問: このソリューションは使用しても問題ありませんか? 見えない問題はありますか? buildLockRequest を呼び出すと、実際に何が起こっているのでしょうか? また、複数のユーザーが同じタスクを表示すると問題が発生する可能性はありますか?

// 編集: 指摘したように、このソリューションは、EclipseLink や OpenJPA などの他の持続性プロバイダーと互換性がない可能性がある Hibernate 固有の呼び出しを使用します。このプロジェクトは内部専用であるため、問題になることはありません。

4

1 に答える 1