27

JPA/Hibernate 複合主キー、@IdClassまたは@EmbeddedId実装には何が優れていますか?その理由は?

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

他に賛成または反対の理由はありますか?JPA(仕様)による推奨事項はありますか?

4

3 に答える 3

8

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

@IdClass基本的に、BMP からの移行を容易にするために、EJB 2.1 からの残り物です。他のまれなコーナーケースでは、それよりも優れている場合があり@EmbeddedIdます。ただし、@EmbeddedIdオブジェクト内のキーの概念をはるかにうまくカプセル化するため、一般的にはより優れており、よりオブジェクト指向です。

@AttributeOverride(s)キーフィールドで必要な場合に使用できます。

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

于 2010-12-27T19:27:05.773 に答える
7

パスカルが書いたように、答えの一部は次のとおりです。

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

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

どのプロパティが PK の一部で、どれがそうでないかを常に正確に覚えておく必要があります。これにより、不必要に JPQL クエリを作成することが複雑になります。

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

于 2010-10-27T13:47:39.597 に答える
2

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

于 2010-12-10T00:36:10.643 に答える