JPA では、複合キー フィールドを作成する方法がいくつかあります。を使った方法を見てみましょう@Embeddable annotation
。
Entity クラスから始めましょう。
@Entity
@Table
public class TraceRecord {
@Id
private TraceRecordPk id;
@Version
@Transient
private int version;
@Column(columnDefinition = "char")
private String durationOfCall;
@Column(columnDefinition = "char")
private String digitsDialed;
@Column(columnDefinition = "char")
private String prefixCalled;
@Column(columnDefinition = "char")
private String areaCodeCalled;
@Column(columnDefinition = "char")
private String numberCalled;
}
これは、@Id フィールドと @Version フィールド、およびいくつかの @Column 定義を持つ非常に単純な Entity クラスです。あまり詳しく説明しなくても、@Version フィールドにも @Transient という注釈が付けられていることがわかります。私のテーブルにはバージョンを追跡するための列もありませんが、データベースはジャーナル処理されているため、バージョン管理についてはあまり心配していません。また、@Column フィールドの columnDefinition 属性に「char」の値が設定されていることにも気付くでしょう。これは、テーブルのフィールドが varchar ではなく char として定義されているためです。それらが varchar の場合、文字列はデフォルトで varchar フィールドにマップされるため、これを行う必要はありません。
@Id
私が今興味を持っている分野です。これは標準の Java 型ではなく、私が独自に定義したクラスです。これがそのクラスです。
@Embeddable
public class TraceRecordPk implements Serializable {
private static final long serialVersionUID = 1L;
@Temporal(TemporalType.DATE)
@Column
private Date dateOfCall;
@Column(columnDefinition="char")
private String timeOfCall;
@Column(columnDefinition="char")
private String callingParty;
/**
* Constructor that takes values for all 3 members.
*
* @param dateOfCall Date the call was made
* @param timeOfCall Time the call was made
* @param callingParty Extension from which the call originated
*/
public TraceRecordPk(Date dateOfCall, String timeOfCall, String callingParty) {
this.dateOfCall = dateOfCall;
this.timeOfCall = timeOfCall;
this.callingParty = callingParty;
}
}
このクラスを Entity クラスの @Id フィールドにできるようにするには、前述のように @Embeddable で注釈を付ける必要があります。複合キー用に選択した 3 つのフィールドは、通常の @Column 定義です。フィールドごとに getter/setter を作成するのではなく、3 つのフィールドすべての値を受け取るコンストラクターを単純に実装して、インスタンスを不変にしました。@Embeddable でクラスにアノテーションを付ける場合、そのクラスは Serializable を実装する必要があります。そのため、対応するためにデフォルトの serialVersionUID を追加しました。
クラスを作成して で注釈を付けた@Embeddable
ので、それを Entity クラスの @Id フィールドの型として使用できるようになりました。簡単なことです。