jPA/Hibernate複合主キー、@ IdClassまたは@EmbeddedId実装にとって何が良いのか、そしてその理由は何ですか?
これは意図的に素朴な質問です。 (何らかの理由で)@EmbeddedIdを使用することにしましたが、間違った選択をしたように感じます。列のプロパティを含むembeddedIdの逆参照は冗長であり、コーディング時にエラーが発生しやすくなります。
他の理由および/または反対の理由は他にありますか? JPA(仕様)による推奨はありますか?
パスカルが書いたように、ここに答えの一部があります:
どちらのアノテーションを使用する必要があります:@IdClassまたは@EmbeddedId
結局、PKプロパティを逆参照するにはembeddedId
プロパティ名を追加する必要があるため、実際には@IdClass
を使用する方がはるかに簡単だと思いますが、これらはすべての非PKプロパティ用に記述されているわけではありません。
どのプロパティがPKの一部であり、どのプロパティがPKの一部ではないかを常に正確に覚えておく必要があります。そのため、JPQLクエリの記述が不必要に複雑になります。
また、JPA 2.0仕様では、@Id
を@XToX
/@JoinColumn
/sプロパティに配置でき、@MapsId
アノテーションが導入されているため、識別関係(別名派生)をマッピングできます。 JPAの識別子)を実装する方が自然です。
まず、可能であれば、複合IDは絶対に避けてください。しかし、本当に必要な場合は、_@EmbeddedId
_をお勧めします。
_@IdClass
_は、基本的に、BMPからの移行を容易にするためにEJBから2.1回残っています。他のまれなコーナーケースでは、_@EmbeddedId
_よりも優れている場合があります。ただし、一般的には_@EmbeddedId
_の方が優れており、OOは、オブジェクトのキーの概念をより適切にカプセル化するためです。
キーフィールドで必要な場合は、@AttributeOverride(s)
を使用することをお勧めします。
埋め込みIDの逆参照が冗長でエラーが発生しやすいと思う理由がわかりません。
I.idclassを使用してそれを行うことを忘れないでください。ただし、マルチフィールドキーを回避するためにできる限りのことを行うことをお勧めします。彼らはただ余分な仕事を作成します。