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