私は Hibernate を初めて使用し、トランザクション境界についていくつか質問があります (スタック オーバーフロー、Hibernate ドキュメントで既に検索しましたが、答えが見つかりませんでした)。
- まず、Maven Hibernate Tools Plugin を使用して Hibernate Bean と DAOS を生成します。
- 生成プロセスの後、データベース アクセス jar を Java プロジェクトに含めます。
単純なクエリは正常に機能しますが、複数の結合を含む複雑なクエリを実行すると、コレクションがフェッチされず (遅延フェッチ)、対応する
get メソッドを使用してデータを取得すると、セッション コンテキストがスレッドであり、セッションがトランザクション コミットで閉じられているため、遅延初期化例外が発生します。
get メソッドを使用してコレクションを明示的に取得するには、セッションを長く存続させる必要があります。
私の休止状態のcfgは次のとおりです。
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306 /mydatabase</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
</session-factory>
この場合、JTA トランザクションを使用する必要がありますか (私は Web サーバーを使用しません)、または遅延コレクションを明示的に初期化せずに、トランザクション スコープ (JDBC) に接続されていないより長いセッションを実現することは可能ですか?