2012-03-29 7 views
0

私はここに少しアドバイスしています。私はJavaでHibernateを使用しています。私はコントローラインタフェースを実装して、ユーザインタフェースと実際の通信をデータベースとの距離を置いています。与えられたインタフェースに対して、私は実際の通信を行うデータベースコントローラクラスを実装しました。これはスタティックコントローラファクトリによってユーザインタフェースに供給されます。Hibernateのアドバイス(セッションを開いたまま)

今、私は、Hibernateが実際に私が望むすべてをメモリにロードしていないことを発見しました。各コントローラメソッド呼び出しについて、私はいつもセッションを開いているし、自分のものをやってセッションを閉じる。私は私のオブジェクト構造にアクセスしようとするので、私は

could not initialize proxy - no Session 

ことを少しの努力と、私は私のアクティブなオブジェクトが参照しているオブジェクトがメモリにないと結論づけグーグルでエラーが表示しています。

今、オブジェクトを最後まで使用し始めてからセッションを開いたままにするオプションがあります。しかし、それは少し冗長でエネルギーが非効率であるようです。私はセッションを開いたままにすることで多くを失うことはないだろうと思うが、私は純粋にデータベース・ビジネスからユーザー・インターフェースを保つことを意図している。私のコントローラインタフェースに、ユーザーインターフェースの "tearDown"(そして "setUp")メソッドを持たせることは、特定のロジックに対して少し見えるでしょう。

+1

私たちはあなたの質問の詳細を必要とするかもしれませんが、私はあなたがhttp://stackoverflow.com/questions/8493087/hibernate-to-be-lazy-or-not-to-be-lazyを確認することをお勧めします – kommradHomer

+0

私は実際に理由と私はそれを避ける方法を得る。ソフトウェアエンジニアリングの分野ではもっと多くのことがあったはずです。私はORMを扱うときの標準が何であったかを知りたいと思っています。なぜなら、ORMを初めて使うからです。 – Vampnik

答えて

0

わかりません。 dbからエンティティオブジェクトをロードし、セッションを閉じた後にエンティティオブジェクトを使用できます。オブジェクトの状態は次に切り離されます。おそらく、それらの状態をdbと同期させるためにセッションに再接続する必要があります。

1

レイジーローディングを使用する場合(これはHibernateのデフォルトのケースです)、セッションが閉じられた後にアンロードされたインスタンスにアクセスすることはできません。

たとえば、1:nの関係(マッピングファイルまたは注釈)でマップされている親テーブルと子テーブルがあります。そして、あなたはこのように実行します。

1)オープンセッション
2)負荷親
3)近いセッション
4)parent.getChild()(またはSTHを呼び出し、このような)
そして、ステップ4で) Hibernateは以前にアイテムをロードしていないので(遅延読み込み)、セッションが既に終了しているため、エラーメッセージが表示されます。

セッションを終了する場合は、必要なすべてのデータが既にロードされていることを確認してください。たとえば、その例で手順3)の前に手順4)を実行していれば、それは機能していました。セッションを閉じた後、既に読み込まれているため、その子に再度アクセスできます。しかし、閉じたセッションのために後でデータベースに格納することはできません。

関連する問題