web-dev-qa-db-ja.com

JPA / Hibernate:複合主キー、@ IdClassまたは@EmbeddedIdの実装に適しているものとその理由は何ですか?

jPA/Hibernate複合主キー、@ IdClassまたは@EmbeddedId実装にとって何が良いのか、そしてその理由は何ですか?

これは意図的に素朴な質問です。 (何らかの理由で)@EmbeddedIdを使用することにしましたが、間違った選択をしたように感じます。列のプロパティを含むembeddedIdの逆参照は冗長であり、コーディング時にエラーが発生しやすくなります。

他の理由および/または反対の理由は他にありますか? JPA(仕様)による推奨はありますか?

26
Kawu

パスカルが書いたように、ここに答えの一部があります:

どちらのアノテーションを使用する必要があります:@IdClassまたは@EmbeddedId

結局、PKプロパティを逆参照するにはembeddedIdプロパティ名を追加する必要があるため、実際には@IdClassを使用する方がはるかに簡単だと思いますが、これらはすべての非PKプロパティ用に記述されているわけではありません。

どのプロパティがPKの一部であり、どのプロパティがPKの一部ではないかを常に正確に覚えておく必要があります。そのため、JPQLクエリの記述が不必要に複雑になります。

また、JPA 2.0仕様では、@Id@XToX/@JoinColumn/sプロパティに配置でき、@MapsIdアノテーションが導入されているため、識別関係(別名派生)をマッピングできます。 JPAの識別子)を実装する方が自然です。

7
Kawu

まず、可能であれば、複合IDは絶対に避けてください。しかし、本当に必要な場合は、_@EmbeddedId_をお勧めします。

_@IdClass_は、基本的に、BMPからの移行を容易にするためにEJBから2.1回残っています。他のまれなコーナーケースでは、_@EmbeddedId_よりも優れている場合があります。ただし、一般的には_@EmbeddedId_の方が優れており、OOは、オブジェクトのキーの概念をより適切にカプセル化するためです。

キーフィールドで必要な場合は、@AttributeOverride(s)を使用することをお勧めします。

埋め込みIDの逆参照が冗長でエラーが発生しやすいと思う理由がわかりません。

9
Victor Stafusa

I.idclassを使用してそれを行うことを忘れないでください。ただし、マルチフィールドキーを回避するためにできる限りのことを行うことをお勧めします。彼らはただ余分な仕事を作成します。

2
drekka