21

現在、EntityManagerを使用してBeanをロードした後にコレクションのプロパティにアクセスしようとしたときに、遅延初期化例外が発生しないように、エンティティBeanのコレクションを熱心にマークしています。

代わりにコレクションを遅延読み込みのままにしておく場合、セッションを開いたままにするにはどうすればよいですか?@Transactionalを試すことを考えましたが、それがうまくいったとしても、長いメソッドでトランザクションを開いたままにしておくのは正しくないように思われるので、やりたくありません。

4

6 に答える 6

9

https://www.hibernate.org/43.html

基本的に、いくつかのオプションがあります。

-フィルター/インターセプター/AOPを使用する「ビューでセッションを開く」パターンを使用できます-サーバー側ロジックの開始時にセッションを開き、終了時に閉じるスタイルのロジック。

-複数の要求/応答サイクルにまたがる会話を実装できます。

昔ながらのサーブレットフィルタが最も簡単です。

于 2009-07-16T20:27:02.337 に答える
5

見逃されていると思われる最後のオプションの1つは、JOINを使用して、ユースケースに基づいてオブジェクトグラフを作成できることです。

これにより、オブジェクトが初期化されます。つまり、はプロキシではなくなります。

トランザクションが閉じられたためにセッションが閉じられたときにどの状態に触れているかを知る必要があるため、クライアントを制御している場合(つまり、APIを公開するオープンサービスを作成していない場合)にこのアプローチを使用します。

于 2009-07-24T15:06:33.890 に答える
3

他の人が言っているように、「ビューでセッションを開く」パターンを読む必要があります。その基本的な考え方は、httpリクエストの処理中ずっと休止状態のセッションを開くことです。Hibernate固有のソリューションとSpringソリューションの両方があります。以前はSpringを使用していましたが、正常に機能します。

質問の中で、トランザクションを長期間開いたくないとおっしゃっています。各リクエストは比較的迅速に処理されるため、ほとんどの人にとってこれは問題ではありません。ただし、あなたの場合、それが実際に不可能である場合、このパターンはあなたのために機能しません。トランザクションを開いたままにしたくない理由について詳しく説明していただけますか?

于 2009-07-17T08:14:22.413 に答える
1

SpringのHibernateTemplateを使用していますか?それは私が信じるあなたのためにセッションを管理します。または、Hibernate 3.0.1以降を使用している場合でも、Springがセッションを管理できるはずです。

これを設定する方法を説明するSpringSourceブログエントリがあります。以下に抜粋を含めました:

Hibernate 3.0.1(および最初にリリースされた時点からのJava Persistence API)以降、Springは、これらのテクノロジーで使用可能なテンプレートを使用しなくても、基盤となるリソースを管理できるようになりました。これは、Hibernate APIを直接使用している場合でも(たとえば、SessionFactory.getCurrentSession()を介して)、Spring管理のHibernateセッションを使用していることを意味します。同じことが、JPAEntityManagerFactoryを介して取得されたEntityManagerにも当てはまります。これが、統合されたエクスペリエンスを得るためにSpringのHibernateTemplateを使用する必要がなくなったもう1つの理由です。[...]

以下は、アプリケーションのアセンブルに使用するXMLです。ご覧のとおり、もちろん、HibernateをセットアップするSpringの方法を使用しています(LocalSessionFactoryBeanを使用)。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!– the works –&gt;
</bean>
<bean id="accountRepo" class="com.mycompany.HibernateAccountRepository">
  <constructor-arg ref="sessionFactory"/>
</bean>

さて、前に述べたように、Hibernate 3.0.1の小さな変更により、Springは、Hibernateセッションを経ることなく、Hibernateセッションを管理できるようになりました。欠けていたのは例外の翻訳でした。これを実現するには、リポジトリに@Repositoryアノテーション(Springが提供)を付け、ポストプロセッサを使用して例外変換をオンにするだけです。

@Repository // from org.springframework.stereotype
public class HibernateAccountRepository implements AccountRepository {
    // see above for full impl…
}
于 2009-07-17T06:10:08.937 に答える
0

一部のデータを読み取ったセッションを開いたままにすると、そのトランザクションは開いたままになります。長時間実行されるトランザクションはそれほど大きな問題ではありませんが(データベースによって異なる場合があります)、実際に問題を引き起こすのはロックが長期間保持されることですが、データベース内のデータを実際に変更した場合にのみ、これらのトランザクションが作成される可能性があります。繰り返しますが、これはデータベースによって異なります。

于 2009-07-16T20:29:10.647 に答える
0

現在、Springは使用していませんが、いくつかの異なるプロジェクトでHibernateを使用しています。最近のプロジェクトで私が決めたアプローチは、防御セッション処理パターン(サーブレットフィルターと組み合わせて)から生まれたものであり、私たちはそれに満足しています。ここで他のデザインパターンを見つけることができます。

于 2009-07-16T20:32:43.387 に答える