( JPA
Java Persistence API) 仕様には、エンティティ複合キーを指定する 2 つの異なる方法があります:@IdClass
と@EmbeddedId
.
マッピングされたエンティティで両方の注釈を使用していますが、JPA
.
複合キーを指定する方法を 1 つだけ採用したい。どれが本当に最高ですか?なんで?
( JPA
Java Persistence API) 仕様には、エンティティ複合キーを指定する 2 つの異なる方法があります:@IdClass
と@EmbeddedId
.
マッピングされたエンティティで両方の注釈を使用していますが、JPA
.
複合キーを指定する方法を 1 つだけ採用したい。どれが本当に最高ですか?なんで?
フィールドアクセス演算子を使用して主キーオブジェクト全体にアクセスできない@EmbeddedId
ため、おそらくより冗長であると思います。@IdClass
を使用すると、次の@EmbeddedId
ように実行できます。
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
これにより、複合キーを作成するフィールドの明確な概念が得られます。これらのフィールドはすべて、フィールド アクセス演算子を介してアクセスされるクラスに集約されるためです。
と のもう 1 つの違いは@IdClass
、@EmbeddedId
HQL を記述する場合です。
あなた@IdClass
と書く:
Employee e から e.name を選択
そして@EmbeddedId
あなたは書く必要があります:
Employee e から e.employeeId.name を選択します
同じクエリに対してより多くのテキストを記述する必要があります。これは、 によって推進されているようなより自然な言語とは異なると主張する人もいるかもしれませんIdClass
。しかし、ほとんどの場合、特定のフィールドが複合キーの一部であることをクエリから直接理解することは非常に役立ちます。
複合主キーを使用するには、次の 3 つの方法があります。
@Embeddable
でマークされた通常のプロパティをエンティティ クラスに追加します@Id
。@EmbeddedId
。@Id
でマークし、エンティティ クラスを でマークして@IdClass
、主キー クラスのクラスを指定します。@Id
as とマークされたクラスで を使用するの@Embeddable
が最も自然なアプローチです。いずれにせよ、@Embeddable
タグは、主キー以外の埋め込み可能な値に使用できます。これにより、複合主キーを単一のプロパティとして扱うことができ、@Embeddable
他のテーブルでクラスを再利用できます。
次に自然なアプローチは、@EmbeddedId
タグの使用です。ここでは、主キー クラスはエンティティではないため、他のテーブルでは使用できませんが@Embeddable
、キーをクラスの単一の属性として扱うことができます。
最後に、@IdClass
および@Id
注釈を使用すると、主キー クラスのプロパティの名前に対応するエンティティ自体のプロパティを使用して、複合主キー クラスをマップできます。名前は対応している必要があり (これをオーバーライドするメカニズムはありません)、主キー クラスは他の 2 つの手法と同じ義務を負う必要があります。このアプローチの唯一の利点は、主キー クラスの使用を外側のエンティティのインターフェイスから「隠す」ことができることです。注釈は、クラス型の値パラメーターを受け取ります。@IdClass
これは、複合主キーとして使用されるクラスでなければなりません。使用する主キー クラスのプロパティに対応するフィールドには、すべて注釈を付ける必要があります@Id
。
参考: http: //www.apress.com/us/book/9781430228509
IdClass の代わりに EmbeddedId を使用しなければならないインスタンスを発見しました。このシナリオでは、追加の列が定義された結合テーブルがあります。結合テーブル内の行を明示的に表すエンティティのキーを表す IdClass を使用して、この問題を解決しようとしました。私はそれをこのように機能させることができませんでした。ありがたいことに、「Java Persistence With Hibernate」には、このトピック専用のセクションがあります。提案されたソリューションの 1 つは私のものと非常に似ていましたが、代わりに EmbeddedId を使用していました。本のオブジェクトをモデルにして、オブジェクトが正しく動作するようになりました。
主な利点は、 ?@GeneratedValue
を使用するときに id に使用できることだと思います。@IdClass
きっと@GeneratedValue
forは使えません@EmbeddedId
。
@Id
を使用する場合、複合キーにはプロパティを指定できません@EmbeddedId
。