0

含まれている Ebean ORM 永続化レイヤーの一部として JPA アノテーションと Hibernate を使用する Play フレームワークを使用してアプリケーションを作成しています。外部キーに関連する JPA アノテーションを理解するのに苦労しています。私の MySQL データベースには、住所 (番地、都市、州、郵便番号など) を格納する Locations というメイン テーブルが 1 つあります。データベース内の他の多くのテーブルは、このテーブルを 1 対 1 または多対多の関係で使用します。問題は、複数のフィールドを Locations の id フィールドにマップしようとするとエラーが発生することです。

たとえば、Docks と LineItems は、Location への参照を含む 2 つのモデルです。各 Dock には Location があり、各 LineItem には 2 つの Location (出発地と目的地) があります。

したがって、Dock には次のコードがあります。

@OneToOne(optional=false)
@JoinColumn(name="loc_id")
public Location location;

LineItem には、次のものがあります。

@OneToOne(optional=false)
@JoinColumn(name="origin")
public Location origin;

@OneToOne(optional=false)
@JoinColumn(name="destination")
public Location destination;

しかし、JPA ではこれが許可されないため、それらすべてを Locations の id フィールドにマップすることはできません。

@Id
@GeneratedValue
@OneToOne(mappedBy="location", fetch=FetchType.EAGER)
@OneToOne(mappedBy="origin", fetch=FetchType.EAGER)
@OneToOne(mappedBy="destination", fetch=FetchType.EAGER)
@Column(name="loc_id")
public Long id;

私はこれについて間違った方法で進んでいると感じています。JPAで外部キー制約を設定する簡単な方法はありますか? Locations は実際には LOT を参照しているため、テーブルに余分な列を作成するような回避策は実際には使用したくありません。私をまっすぐにするためのアドバイスをいただければ幸いです。

4

1 に答える 1

0

あなたが示した場所の設定は意味がありません。あなたの完全な意図で解釈できる場合、JPAにとってそれが意味することは次のとおりです。

  1. Location には、生成された値であり、列 loc_id にマップされる Long "id" プロパティがあります。
  2. 「id」プロパティは Dock であり、Dock と Location の間の 1 対 1 の双方向関係の非所有側です。
  3. これは、LineItem からの 1 対 1 の双方向関係の非所有端である LineItem であり、起点と終点の両方です。

明らかに意味がありませんよね?これらすべての@OneToOne注釈を Location に含める場合は、それぞれが独自のフィールドにある必要があります。1 つの Dock と 2 つの LineItems に加えて、言及した Location との他のすべての関係についてです。Location はまさにそれであり、他のものがそれを参照するかどうかは問題ではないため、これは明らかに望ましくありません。したがって、本当に必要なのは、Location への一方向のリレーションシップです。すでに Location が非所有側としてマップされているため (「mappedBy」パラメーターを介して)、@OneToOneLocation から s を削除するだけです。必要なのは、たとえば次のとおりです。

@OneToOne
@JoinColumn(name="origin")
public Location origin;

つまり、「origin」プロパティは、このエンティティがマップされているテーブルの「origin」フィールドに主キーが格納されている場所です。

その点で、これらすべてが実際には 1 対 1 の関係ではないことが予想されます。少なくとも LineItem のものは 1 対多です。2 つの広告申込情報の出発地または目的地が同じになることは決してないだろうとは想像できません。

ちなみに、optional=falseがデフォルトですが、そのフィールドが null になるのを防ぐと考えている場合は、そうではありません。オプションのパラメーターは、外部キーによって参照される行が欠落している場合に例外をスローするかどうかを JPA に通知するだけです。

それは一種の高レベルの概要です。わからないところがあればどんどん質問してください。Hibernate Annotations ガイドは、多くのことを理解するのに役立ちます。また、 Hibernateにデータベース スキーマを生成させることも非常に役立ちます。これにより、テーブル構造に関して何を伝えているかを Hibernate が理解しているかどうかを確認できます。

于 2013-01-01T05:35:47.720 に答える