2009-05-19 5 views
2

私は春と冬眠を含むかなり大きなプロジェクトを持っています。今は、特定のオブジェクトを休止状態から記憶に戻しています。私はある種の障害にぶつかっています。私は以下の設定をしています。休止状態のセッションを手動で開くにはどうしたらいいですか?

クラスAにはいくつかのプリミティブとクラスBが含まれています。BにはプリミティブとクラスCが含まれています。これは以前は遅延ロードでした。

は今、私はこの

サービスコール1持っている:
1)作成したクラスのオブジェクトを
2)クラスBのオブジェクトを取得

4の 3)集合B) )
1.メモリ
2から取得)
3からBを取得する)BからCを得る:

メモリへのサービスコール2を追加 4.)操作するC

Cは遅延ロードされているため、休止状態でBから遅延ロードするために存在する休止状態のセッションに依存しています。しかし、今度は、をロードせずに、IDを返すようにDAOを変更してください。現在、OpenSessionInViewでハイバネーションするセッションはありません。限界を考えて、この問題を解決する最良の方法は何ですか?私が見つけた唯一の解決策は、不適切なコードの変更や既存のセッションに依存しているため、おそらく手動で休止状態のセッションを開くことができると思います。これをどうやってやりますか?あるいは、この問題に対するより良い解決策がありますか?

+0

JPAまたは汎用のHibernateを使用していますか?この問題を解決するために何をしましたか? –

答えて

2

設定済みのSessionFactoryへの参照を取得できる場合は、openSession()を呼び出すだけで済みます。

+0

私はsessionFactoryを注入していますので、これを試してみましょう。 –

4

ベストプラクティスとして、セッションファクトリを使用することをお勧めします。 Netbeansが生成するものがここにあります。

public class HibernateUtil { 

    private static final SessionFactory sessionFactory; 
    private static final Configuration configuration = new Configuration().configure(); 

    static { 
     try { 
      // Create the SessionFactory from standard (hibernate.cfg.xml) 
      // config file. 
      sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      // Log the exception. 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

は、あなたがこれをしたら、トランザクションのトランザクションをオープンすると、セッションを開くこと

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
session.beginTransaction(); 
//Do something 
session.getTransaction().commit(); 

注このコードを使用することができます。私は純粋なHibernate(JPAとは違って)で何かをするためにトランザクションが必要だと思っています。

あなたはより洗練されたソリューションについては、この

HibernateUtil.getSessionFactory().close(); 

を行うことを確認したいプログラムの終了時に、あなたは春またはEJBを自動セッション/トランザクション管理に見てみたいことがあります。一度正しく構成されたシーンの背後にあるセッションを処理します。

EDIT:
はちょうどあなたの疑問とIDについてあなたのポイントを再読み込み。私はあなたが複数のスレッドのアプリケーションをやっていない限り、sessionfactoryのアプローチはあなたの目的のために動作すると信じています。これは、デフォルトでは、HibernateセッションとそのセッションにリンクされたORMオブジェクトが1つのスレッドにのみ関連付けられているためです。私がこれについて間違っているかどうか教えてください。

+2

インポートするパッケージをコード例で含めてください。インポートするパッケージを推測する必要はありません。 –

1

HibernateTemplateHibernateDaoSupportを使用してDAOを実装していますか?その場合は、オブジェクトが接続されていない理由です。しかし、その場合はOpenSessionInViewInterceptorを使用できるはずです。インターセプタを使用できないことを確認するために何かしましたか?

また、新しいSessionを開くことを選択した場合、メモリ内のオブジェクトは新しいSessionに関連付けられません。レイジーローディングが機能するためには、オブジェクトをセッションに再接続する必要があります。

1

BオブジェクトのCオブジェクトが参照されている可能性がある場合は、CオブジェクトをプリフェッチするようにBオブジェクトを取得する必要があります。例えばHQL

from B as b where b.id = :ID 

は、単に) セッションセッション=新しいコンフィギュレーションを(使用

from B as b left join fetch b.c where b.id = :ID 
-2

なり(設定)buildSessionFactory()getCurrentSession()。。。。 または セッションセッション= new Configuration()。configure()。buildSessionFactory()。getOpenSession();

関連する問題