0

私は 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) に接続されていないより長いセッションを実現することは可能ですか?

4

1 に答える 1

0

カスタム DAO と Bean を生成するために、休止状態ツール コード テンプレート (ftl ファイル) を変更しました。

Maven Hibernate Tools Plugin を使用して、データベース アクセス レイヤーを生成します。

デタッチされたオブジェクトを新しい Hibernate セッションに再接続するメソッドを Hibernate Beans に追加することは合理的でしょうか? 何かのようなもの:

s.getCurrentSession().beginTransaction();

r.lock(p、LockMode.NONE);

getter メソッドによってデータが取得されると、トランザクションがコミットされ、セッションが閉じられます。この戦略により、遅延初期化の問題は回避されると思います。

マルチスレッドまたはマルチプロセスの場合に問題があるかどうかはわかりませんが。

ありがとうございました。

于 2013-02-06T10:31:53.790 に答える