18

私は 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")

その結果、user1inusers_1_tableuser2 inが必要になりusers_2_tableます。

システムの制限により、これら 2 つのオブジェクトを 1 つのテーブルに入れることはできません。(余分なフィールドを作成することさえ悪い考えです)。

サブクラス化せずにこれを行うことはできますか? プログラムで休止状態の構成を使用していますか?

4

5 に答える 5

1

構成を使用してそれを行うことができます:

  • 同じ Entity Class に対して 2 つのマッピングを作成しますnameが、それらに異なる論理名entity-nameテーブル名を付けます。
  • 次に、 をパラメータとして指定Sessionするメソッドを使用しentityNameて、これらを区別します。

これは何を達成しますか?

  • 「仮想サブタイピング」
  • データを型に取得するときは、entity-typeどちらか一方を指定する必要があります (したがって、いずれかのテーブルを意味します)。
  • データを変更して保存するときは、同じものを指定する必要があります。entity-type異なるもので更新しようとすると、entity-type休止状態によって拒否されます。そうしないと、変更されたエンティティには既に識別子が入力されているため、休止状態は挿入ではなく更新を試みますが、データベースでは失敗します - テーブルに存在しなかったデータを更新しようとします。
  • これは分離につながります。エンティティまたはエンティティのリストで作業するときは、1 つのエンティティ タイプにコミットする必要があり、2 つを混在させることはできません。つまり、「仮想サブタイピング」

費用は?

  • それは非常に弱いタイピングを与えます。コンパイラとランタイムには、真のサブタイプは示されません。エラーが発生するのを待っているため、デバッグが難しい場合があります。
  • 非標準です。JPA はこれを回避しました。これを含めることはレーダーに載っていないと思いますが、それには正当な理由があります。
  • 注釈ではなく、XML を使用する必要があります。
  • 「entity-type」パラメーターを含む通常とは異なるメソッドを呼び出す必要があります。

サブタイピングに勝る利点はありますか?

  • 私が見ることができるものはありません

やるべきですか?

  • 私はそうは思わない!サブタイプと標準コードを使用します。
于 2013-05-29T10:22:35.013 に答える
0

使用したことはありませんが、休止状態にはセカンダリ テーブルの概念があります。@SecondaryTables は、エンティティが複数のテーブルをマップしてデータをフェッチできる hibernate のアノテーションです。データを取得しているエンティティには @SecondaryTables アノテーションが必要です。主キーと外部キーに基づいて、また一意の制約に基づいて、セカンダリ テーブルを関連付けます。

これは、グーグルを実行した後に見つけた1つのサンプルです。それが達成に役立つかどうかを確認してください:

http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php

于 2013-05-26T01:01:32.847 に答える