2009-06-09 4 views
3

設定:データベースにhibernateによって保持されているオブジェクト(AProduct)があります。このオブジェクトは、リポジトリに格納された別のオブジェクト(AComponent)を参照します。製品のデータベーステーブルでは、コンポーネントのIDのみを保存する必要があります。製品をロードすることで、私は自分のリポジトリから正しいコンポーネントをロードしたいと思います。HibernateはリポジトリからUserTypeオブジェクトをロードします

これまでのところ私の解決策は、IDだけを保存するようにコンポーネントのUserTypeを作成することです。これまでは簡単です。私はIDを持っているので、コンポーネントをロードすることも大したことではありません。

私の問題は、ComponentUserTypeのリポジトリへのリンクを取得する方法です。

私はjavaとHibernate/Annotationsを使用していますが、その解決策は独立している可能性があります。

+0

リポジトリについてもう少し詳細を教えてください。 –

+0

リポジトリは、xml-sourceからいくつかのオブジェクトをロードするランタイム・リポジトリです。リポジトリを初期化するには、クラスローダーとXMLソースパスが必要です。リポジトリをsingeltonとして使用する方法は、アプリケーションごとに1つのリポジトリしかないので、これを行う方法です。私は、ユーザタイプ内でハイバネート設定から情報を取得する方法があることを期待していました。 – cornz

答えて

1

「リポジトリ」とは、データベース以外の外部ソースを意味します。ウェブサービスなんか?とにかく、リポジトリへのリンクがすべての製品オブジェクトで同じ静的な設定である場合、設定を保持するためのスタティックアクセサメソッド(例えば "getInstance()")を持つシングルトンオブジェクトを作成することができます。 UserTypeオブジェクトは、リポジトリ設定をシングルトンから引き出すことができます。 Springのような依存性注入フレームワークを使用している場合は、それを使ってプロパティファイルなどからシングルトンを初期化することさえできます。もっと良い選択肢は、Spring(またはGuiceなど)を使用して設定を直接UserTypeにプッシュすることです。しかし、UserTypeオブジェクトライフサイクルはHibernateによって制御されるので、それは扱いにくいことがあります。

リポジトリリンクが製品ごとに異なる場合は、IDと共にデータベースに保存することが理にかなっています。これを行う1つの方法は、IDリポジトリのペア設定とコンポーネントへの参照をカプセル化するクラスを作成することです。次に、そのクラスをプロダクトクラスのプロパティタイプとして使用し、Hibernate UserTypeにそのクラスをIDとリンクを保持する2つのカラムにマップさせます。

0

アプリケーションスタックを初期化するためにSpring Frameworkを使用していますか?そのような場合は、SingletonBeanFactoryLocatorをチェックしてください。アプリケーションリソースにSpringフレンドリーな方法でアクセスできるようになります。

http://www.jdocs.com/spring/2.0.6/org/springframework/beans/factory/access/SingletonBeanFactoryLocator.html

あなたが春を使用していない場合、私はあなたのアプリケーションスタックのどこかで静的クラスから露出のThreadLocalを使用してになります。 UserTypeで使用する前に、リポジトリがThreadLocalにバインドされていることを確認する必要があります。

関連する問題