1

AとBの2つのJavaクラスがあり、AはBへの参照を保持しています。

public class A {
   private long id;
   private B b;
   ...
}

public class B {
   private long id;
   ...
}

私のデータベースには、参照されているBのIDとともに、Aのインスタンスのみが保存されています。

$ select * from tableA;
id  | bid | ...
---------------
1   | 42  |
2   | 42  |
3   | 43  |
...

ただし、Bはデータベースに保存されませんが、サービスレイヤーServiceBの実装を通じてアクセスできます。

public interface ServiceB {
   public B getB(long bid);
}

Hibernateを使用してそれをモデル化するにはどうすればよいですか?XMLベースのHBM構成を使用することをお勧めします。また、Aホールディングビッドに一時的なフィールドを追加することは避けたいと思います(可能な場合)。

4

3 に答える 3

0

aを導入し、RepositoryAとBに基づいて新しいオブジェクトを構築します。RepositoryはHibernateを使用Aして取得し、Serviceを使用して取得しますB

于 2012-10-08T16:01:55.670 に答える
0

新しいorg.hibernate.persister.entity.EntityPersisterを開発する必要があります。これは基本的に、Hibernate OGM(NoSQLバッキングを使用するHibernate + JPA)が行うことです。これを実現する方法についてのリファレンスが必要な場合は、引き続きリレーショナルエンティティには標準のパーシスターを使用し、非リレーショナルエンティティにはカスタムパーシスターを使用します。

于 2012-10-08T19:39:52.547 に答える
0

参考のために見つけた解決策をここに投稿します。

クラス内のフィールドUserTypeのマッピングで使用されるカスタム休止状態を作成する必要があります。実装はすでにインターネットで十分に説明されており、ここでは重要ではありません。操作は、サービスレイヤーから対応するBをロードすることにより、データベースIDをBインスタンスに変換すると言えば十分です。逆に、Bインスタンスをその内部IDに変換して、データベースに保存します。bidAUserTypenullSafeGet()nullSafeSet()

このカスタムユーザータイプをサービスレイヤーにリンクすることは、使用するインジェクションフレームワーク(Guice、Spring、カスタムソリューションなど)に応じていくつかの方法で実行できますが、問題にはなりません。

You need a custom UserType for each referenced class B. Using generics may be useful in the case of several referenced classes deriving from a common base class, it's left as an exercise to the reader.

于 2012-10-15T07:56:49.930 に答える