提供されたコードでは、コンポーネントとして levelStation と confPathID を使用して、Time テーブルに対して複合キーが定義されています。 JPA と Hibernate でこの複合キーをマップするには、@EmbeddedId と @IdClass の 2 つのオプションがあります。
@IdClass アノテーションを使用すると、エンティティの複数のフィールドを複合主キーを形成します。これには、主キーを表すクラスを定義する必要があります。この場合、TimePK クラスは次のように定義できます。
@IdClass(TimePK.class) public class Time implements Serializable { // ... }
ここで、TimePK は、引数なしのコンストラクター、主キー フィールドのゲッター/セッター、および equals( を定義する必要がある別のクラスです。 ) および hashCode() メソッド。
@EmbeddedIdアノテーションは、埋め込みクラスをエンティティの主キーにマップします。 @IdClass とは対照的に、このアプローチはエンティティ クラスと主キー クラスを組み合わせます。 @EmbeddedId の使用方法は次のとおりです。
@Entity class Time implements Serializable { @EmbeddedId private TimePK timePK; // ... }
この場合、TimePK は Time エンティティの内部クラスであり、引数なしのコンストラクター、キー フィールドのゲッター/セッター、および等しいものも定義する必要があります。 () メソッドと hashCode() メソッド。
@IdClass と @EmbeddedId の主な違いは、クエリ構文への影響です。 @IdClass を使用すると、エンティティを介して主キー フィールドに直接アクセスできますが、@EmbeddedId を使用すると、埋め込みクラスのゲッターを介してそれにアクセスします。
この 2 つのどちらかを選択する場合、@EmbeddedId は事実を伝えます。主キーはドメイン モデル内で意味のある ID を持っていることを示しますが、 @IdClass は主キーが単にフィールドを一意に識別するフィールドの組み合わせであることを示唆しています。 entity.
JPA 1.0 仕様:
以上が@EmbeddedId と @IdClass を使用して JPA と Hibernate で複合キーをマッピングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。