0

私のデータベースのスキルは少し錆びているので、Hibernate を学ぶのは少し難しいです。

私は 1 対 1、1 対多、多対多について読んできましたが、一言で言えば、これは私が若い頃から理解していることです。

1 対 1: - テーブル A はテーブル B の別の行にリンクされており、テーブル A の行数はテーブル B の行数と等しくなければなりません。

一対多: - 各企業は多数の従業員を持つことができます。

多対多: - 多くの医師がさまざまな患者を担当/共有できます。(しゃれは意図されていません)。

アンダーテイカークライアントモデル用に、次のテーブルがあるとしましょう

テーブルパーソン:

[id[pk]、fullname(char)、age(int)、address(char)、sendFlowers(boolean)、country_id[fk]、whenDead_id[fk]]

1, 'Martin Jensen', 91, 'Notlucky Street 4', false, 2, 1

2、「Kill​​er Klaus」、67、「Die-Hard Strasse 9」、true、1、2

2、「ビンゴマン」、46、「シークレットアドレス」、true、1、2

表: 国

[id[pk]、名前(文字)]


1、「ドイツ」

2、「北朝鮮」

表: WhenDead


[ id[pk], actionToTake(char) ]

1、「無視・受け取り不可」

2、「火葬・身内をまねて保険金を集める」

通常の状況では、これらのテーブルからの情報が必要な場合は、単純な SQL を使用して 2 つの外部キーへの結合を使用するだけです。(id だけでなく、説明も参照してください)。各人は 1 つの国と 1 つの WhenDead テーブルにしか接続できませんが、重複を避けるために、もちろん複数の人が同じ外部キー値を参照できる必要があります。

これらの両方のテーブルの列名をエンティティの外部キー ID として、Hibernate で @OneToOne アノテーションを使用しようとしました。それは機能しますが、OneToOneの略に反するようです...「テーブルの各行には別のテーブルの対応する行がある」および「行の数は両方のテーブルで一致する必要があります」。

一対多または多対多を使用するのは不自然に思えます。

誰かが私を正しい方向に押し進めることができますか、それとも OneToOne を続行するべきでしょうか。

4

1 に答える 1

1

あなたはそれを間違っており、ManyToOne という 1 種類の関連付けを忘れていました。

あなたの例を見てみましょう:

  • A から B への OneToOne: A には 0 個または 1 個の B があり、B を複数の As に関連付けることはできません。したがって、両方のテーブルの行数は必ずしも同じではありません。例: 1 台の車には 1 つのプレート番号 (まだ販売されていない場合は 0) があります。OneToOne は確かに非常にまれであり、例を見つけるのに苦労しました。

  • OneToMany: 1 つの A に 0、1、または複数の B があります。例: 会社には多くの従業員がいます。

  • ManyToOne: A には 0 個または 1 個の B があり、B は複数の As に関連付けることができます。たとえば、人には父親が 1 人います (そして、父親には複数の子供がいる場合があります)。

  • ManyToMany: A には 0、1、または複数の B があり、B は 0、1、または複数の As に関連付けることができます。典型的な例: 1 人の学生が多くのコースを持っていて、1 つのコースの後に複数の学生が続いている。

したがって、テーブル/エンティティには、次の関連付けがあります。

  • 人 - 多対一 - 国
  • 人 - ManyToOne - WhenDead

確かに、同じ国に複数の人が住んでいますが、人は 0 か 1 つの国に住んでいます。また、火葬を希望する人も何人かいるかもしれませんが (適切な英語かどうかはわかりません)、火葬と埋葬の両方を行うことはできません。

もちろん、これらの関連付けを双方向にすることも、逆方向にのみ実装することもできます。その場合、あなたは

  • 国 - OneToMany - 人
  • WhenDead - OneToMany - 人

つまり、あるテーブルから別のテーブルへの外部キーを持つたびに、ManyToOne または OneToOne 関連付けが行われます。外部キーに一意の制約を設定できる場合、それは OneToOne です。最初のテーブルの 2 つの行がターゲット テーブルの同じ行を参照できないことが保証されているためです。それ以外の場合は、ManyToOne です。

于 2013-10-05T17:14:03.627 に答える