私は1つのエンティティ-User
を持っています。 _User.class
_で記述されます。
Hibernateはエンティティごとに1つのテーブルを作成するため、session.save(user)
を呼び出すと、データは常にこのテーブルに保存されます。
同じUser
タイプのデータ用に別のテーブルが必要になり、エンティティをそのテーブルにのみ保存する必要があります。
データ構造(このようなもの):
_table users_1_table{
string id;
string username;
}
table users_2_table{
string id;
string username;
}
_
これで作業:
_session.save(user1,"users_1_table")
session.save(user2,"users_2_table")
_
その結果、_user1
_に_users_1_table
_があり、_user2
_に_users_2_table
_があるはずです。
システムの制限により、これら2つのオブジェクトを1つのテーブルに入れることはできません。 (余分なフィールドを作成することも悪い考えです)。
サブクラス化せずにこれを行うことはできますか?プログラム的に休止状態の構成を使用していますか?
序文:
これはSOでも広く尋ねられた質問であり、回答もSubclass
または実際にSuperClass
アプローチに関連しています(例:[ 1 ])
実際の回答:
これらの投稿[ 2 ]、[]は、EntityName
パラメータを使用したxmlマッピングの使用を提案しています。
したがって、スーパークラスを必要としないxmlでのマッピングは、2つの同一のマッピングにEntityName
パラメータを与えるだけです。
マッピング例:
_<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.User, DomainModel"
table="User1Object" entity-name="User1Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
<class name="DomainModel.User, DomainModel"
table="User2Object" entity-name="User2Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
</hibernate-mapping>
_
次に、必要なエンティティのタイプに応じて、適切なセッションメソッドを次のように呼び出します。
_session.Save("User1Object", user1)
または
_session.Save("User2Object", user2)
投稿2と3は、このスニペットの基礎として使用されました。公式ソース[ 4 ]
試合後:
実際にこの投稿にリンクされている最初の質問に対する1つの回答[ 5 ]異なるアプローチがあります。
オブジェクトの最初のインスタンスに別れを告げ、データを新しいインスタンスに複製し、別の名前で永続化します。したがって、Hibernateロジックおよびすべてのコンテンツに対する違反はありません。2つのテーブルで同じデータが使用され、サブクラスは使用されません。
まあ、そのアプローチの実装やコードや信頼性はそうです、私もそれをテストしていません。
別のケース:
この投稿[ 6 ]では、スーパークラスアプローチにもっと簡単な方法で挑戦しようとしている人がいますが、最も信頼できる回答は、別の方法では不可能だと述べています、公式の非XMLアプローチは、上記のサブクラスアプローチです。
ソース
[1] hibernate/jpaアノテーションを使用して1つのクラスを別のテーブルにマップする方法
[2] 2つの同一のテーブル(同じスキーマ...)をHibernateの同じエンティティにマップ
[3] 2つの同一のテーブル(同じプロパティ)を1つのエンティティにマップする方法
[4] http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname
[5] Hibernate 4:2つのテーブルをマッピングする1つのクラス-両方のテーブルで1つのオブジェクトを永続化する方法?
また、デフォルトのエンティティと代替のエンティティを使用して機能します。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DomainModel.User, DomainModel"
table="User1Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
<class name="DomainModel.User, DomainModel"
table="User2Object" entity-name="User2Object">
<id name="_id" access="field" column="id">
<generator class="assigned"/>
</id>
<property name= ...>
</class>
</hibernate-mapping>
デフォルトの場合、メソッドを使用できます
_session.Save(user1)
そして
_session.Save("User2Object", user2)
代わりのもののために。
設定を使用してそれを行うことができます:
name
ですが、それらに異なる論理entity-name
、およびtable名前。Session
メソッドを使用して、entityName
をパラメーターとして指定し、一方を他方と区別します。これにより何が達成されますか?
entity-type
またはその他(つまり、いずれかのテーブルを意味します)entity-type
-異なるentity-type
はhibernateによって拒否されます。それ以外の場合、変更されたエンティティにはすでに識別子が入力されているため、Hibernateは挿入ではなく更新を試みますが、データベースでは失敗します-テーブルに存在しなかったデータを更新しようとします。費用はいくらですか?
サブタイピングよりもメリットはありますか?
それをしますか?
私はこの質問がずっと前に尋ねられたことを知っています。しかし、休止状態のものを使用せずに、別の方法を提案したいと思います。 xml設定を使用したくない人のために。
Commun列のゲッターメソッドとセッターメソッドを使用してインターフェイスを宣言し、towエンティティクラスにこのインターフェイスを実装させます。通常どおり、この2つのエンティティクラスにマッピングアノテーションを残します。コードでは、代わりにこのインターフェイスのメソッドを呼び出すことができます。
私は使用したことがありませんが、休止状態のセカンダリテーブルの概念があります。また、@ SecondaryTablesは、エンティティが複数のテーブルをマップしてデータをフェッチできるようにするHibernateのアノテーションです。データをフェッチするエンティティには@SecondaryTablesアノテーションが必要です。プライマリテーブルと外部キーに基づいて、また一意の制約に基づいてセカンダリテーブルを関連付けます。
これは私がグーグルをした後に見つけた1つのサンプルです、それがあなたが達成するのに役立つかどうかを確認してください:
http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php