146

( JPAJava Persistence API) 仕様には、エンティティ複合キーを指定する 2 つの異なる方法があります:@IdClass@EmbeddedId.

マッピングされたエンティティで両方の注釈を使用していますが、JPA.

複合キーを指定する方法を 1 つだけ採用したい。どれが本当に最高ですか?なんで?

4

7 に答える 7

107

フィールドアクセス演算子を使用して主キーオブジェクト全体にアクセスできない@EmbeddedIdため、おそらくより冗長であると思います。@IdClassを使用すると、次の@EmbeddedIdように実行できます。

@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
  @EmbeddedId EmployeeId employeeId;
  ...
}

これにより、複合キーを作成するフィールドの明確な概念が得られます。これらのフィールドはすべて、フィールド アクセス演算子を介してアクセスされるクラスに集約されるためです。

と のもう 1 つの違いは@IdClass@EmbeddedIdHQL を記述する場合です。

あなた@IdClassと書く:

Employee e から e.name を選択

そして@EmbeddedIdあなたは書く必要があります:

Employee e から e.employeeId.name を選択します

同じクエリに対してより多くのテキストを記述する必要があります。これは、 によって推進されているようなより自然な言語とは異なると主張する人もいるかもしれませんIdClass。しかし、ほとんどの場合、特定のフィールドが複合キーの一部であることをクエリから直接理解することは非常に役立ちます。

于 2008-10-17T14:27:03.720 に答える
24

複合主キーを使用するには、次の 3 つの方法があります。

  • としてマークし、@Embeddableでマークされた通常のプロパティをエンティティ クラスに追加します@Id
  • でマークされた通常のプロパティをエンティティ クラスに追加します@EmbeddedId
  • すべてのフィールドのエンティティ クラスにプロパティを追加し、それらを@Idでマークし、エンティティ クラスを でマークして@IdClass、主キー クラスのクラスを指定します。

@Idas とマークされたクラスで を使用するの@Embeddableが最も自然なアプローチです。いずれにせよ、@Embeddableタグは、主キー以外の埋め込み可能な値に使用できます。これにより、複合主キーを単一のプロパティとして扱うことができ、@Embeddable他のテーブルでクラスを再利用できます。

次に自然なアプローチは、@EmbeddedIdタグの使用です。ここでは、主キー クラスはエンティティではないため、他のテーブルでは使用できませんが@Embeddable、キーをクラスの単一の属性として扱うことができます。

最後に、@IdClassおよび@Id注釈を使用すると、主キー クラスのプロパティの名前に対応するエンティティ自体のプロパティを使用して、複合主キー クラスをマップできます。名前は対応している必要があり (これをオーバーライドするメカニズムはありません)、主キー クラスは他の 2 つの手法と同じ義務を負う必要があります。このアプローチの唯一の利点は、主キー クラスの使用を外側のエンティティのインターフェイスから「隠す」ことができることです。注釈は、クラス型の値パラメーターを受け取ります。@IdClassこれは、複合主キーとして使用されるクラスでなければなりません。使用する主キー クラスのプロパティに対応するフィールドには、すべて注釈を付ける必要があります@Id

参考: http: //www.apress.com/us/book/9781430228509

于 2017-02-13T21:38:48.270 に答える
17

IdClass の代わりに EmbeddedId を使用しなければならないインスタンスを発見しました。このシナリオでは、追加の列が定義された結合テーブルがあります。結合テーブル内の行を明示的に表すエンティティのキ​​ーを表す IdClass を使用して、この問題を解決しようとしました。私はそれをこのように機能させることができませんでした。ありがたいことに、「Java Persistence With Hibernate」には、このトピック専用のセクションがあります。提案されたソリューションの 1 つは私のものと非常に似ていましたが、代わりに EmbeddedId を使用していました。本のオブジェクトをモデルにして、オブジェクトが正しく動作するようになりました。

于 2008-10-17T19:05:06.903 に答える
8

主な利点は、 ?@GeneratedValueを使用するときに id に使用できることだと思います。@IdClassきっと@GeneratedValueforは使えません@EmbeddedId

于 2011-01-12T19:15:28.393 に答える
6

@Idを使用する場合、複合キーにはプロパティを指定できません@EmbeddedId

于 2014-08-30T06:24:55.027 に答える