Hibernate遅延読み込みはどのように設定しますか?
Hibernateでは、遅延ロードとは、オブジェクトが関連付けられている場合に、関連オブジェクトをデータベースからすぐにロードするのではなく、関連オブジェクトに初めてアクセスしたときにデータベースからロードすることを指します。Hibernateの遅延ロードは以下のように設定できます。
- なまけ者
- プロキシオブジェクトを利用した関連オブジェクトの遅延読み込み。関連オブジェクトにアクセスされた時点で、Hibernateはプロキシオブジェクトを介してデータベースからデータを読み込む
- Lazy=”no-proxy”: 関連オブジェクトのロードをプロキシせず、直接行います。つまり、関連オブジェクトにアクセスすると、Hibernate はデータベースからデータを即座にロードします。
サンプル:
<many-to-one name="customer" column="customer_id" lazy="proxy" />
- フェッチ戦略を使う: Hibernateのクエリ文にフェッチ戦略を設定することで、関連オブジェクトをいつロードするかを制御できます。よく使われるフェッチ戦略は次のとおりです。
- FetchType.LAZY:関連するオブジェクトを遅延ロードします。関連するオブジェクトにアクセスする際に、データベースからロードされます。
- FetchType.EAGER:関連オブジェクトを即時ロードします。主オブジェクトをクエリするときに、関連オブジェクトも同時に取得します。
英語ではこうなります:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;
LazyInitializationExceptionが発生する可能性があることに注意してください。これは通常、トランザクションがまだアクティブだがセッションがすでにクローズされているときに発生します。LazyInitializationExceptionを回避するには、トランザクション中にHibernateのinitialize()メソッドを使用して関連オブジェクトを明示的に初期化します。
要約:Hibernateの遅延読み込み設定では、遅延読み込み方針やフェッチ方針を指定することで、関連オブジェクトの読み込みタイミングが制御できます。