7

まず、Hibernate - One table with multiple entities? を読みました。.

ただし、2 つのエンティティを同じテーブルにマップしたいのですが、両方を選択できるエンティティにしたいと考えています。私が意味したのは:

  • 1 つのテーブル: Person (id、name、dateOfBirth、city、street、zipcode)。
  • 2 つのエンティティ: Person (id、name、dateOfBirth)、Address (id、city、street、zipcode)。

したがって、エンティティ間の 1:1 の関係ですが、DB には 1 つのテーブルがあります。

上記のリンクで提案されたソリューション (コンポーネント キーワード) を使用してそれを行うと、Address を直接クエリすることはできません (Person エンティティを介してアクセスできます)。そしてできるようになりたい

session.createCriteria(Adres.class)

それ、どうやったら出来るの?

更新: アドレス マッピングで、エンティティ間の 1 対 1 の関連付けを試みました。

<one-to-one name="Person " class="model_mapowanie_xml.Person "/>

およびイン パーソン マッピング:

<one-to-one name="Address" class="model_mapowanie_xml.Address "/>

どちらのクラスにも、もう一方を参照するフィールドがあります。そのためには、レコードの選択がうまく機能します。ただし、両方のエンティティを使用して 1 つのトランザクションにレコードを追加するにはどうすればよいですか? (ID は db によって生成されます)

Address ad = new Address();
ad.setProperty("Sydney");
Person p = new Person();
p.setProperty("John");
p.setAddress(ad);
session.save(p);

Person 部分のみが保存され、address プロパティは空のままです。

4

2 に答える 2

5

@Tableアノテーションを使用してそれを行うことができるはずです。これらのエンティティは異なるエンティティとして扱われますが、同じテーブルにマップされます。

@Entity
@Table(name="PERSON_TABLE")
class Person {}


@Entity
@Table(name"PERSON_TABLE")
class Address {}

編集:

両方のエンティティを 1 つのトランザクションで保存する場合は、それらを使用して明示的に保存するSessionか、プロパティを設定cascadeして関係の操作をカスケードする必要があります。Person で何かを行うときに、 Address で操作をカスケードしたいと思います。注釈を使用する場合はCascadeTypeを参照してください。

あなたのhbmでは次のようになります <one-to-one name="Person" class="model_mapowanie_xml.Person" cascade="all"/>

于 2013-08-31T12:29:33.203 に答える