埋め込み可能クラス
埋め込み可能クラスは、エンティティクラス のプロパティをグループ化します。
埋め込み可能クラスの定義
次のコードスニペットは、埋め込み可能クラスを定義する方法を示しています。
@Embeddable
public class Address {
final String city;
final String street;
@Column(name = "ZIP_CODE")
final String zip;
public Address(String city, String street, String zip) {
this.city = city;
this.street = street;
this.zip = zip;
}
}
埋め込み可能クラスはエンティティフィールドの型として使用されます。
@Entity
public class Employee {
@Id
Integer id;
Address address;
}
上記のエンティティ定義は、次のエンティティ定義と同等です。
@Entity
public class Employee {
@Id
Integer id;
String city;
String street;
@Column(name = "ZIP_CODE")
String zip;
}
注釈
Java 14 以降のバージョンでは、records に @Embeddable
アノテーションを付けることができます。
@Embeddable
public record Address(
String city,
String street,
@Column(name = "ZIP_CODE")String zip) {
}
命名規則
命名規則は、埋め込み可能クラスを利用している エンティティクラス から継承されます。
フィールドの定義
デフォルトでは、フィールドは永続的で、データベースまたは結果セットのカラムに対応します。
フィールドの型は次のいずれかである必要があります。
java.util.OptionalInt
java.util.OptionalLong
java.util.OptionalDouble
@Embeddable
public class Address {
...
String street;
}
カラム
カラム名を @Column
アノテーションで指定できます。
@Column(name = "ZIP_CODE")
final String zip;
Transient
埋め込み可能オブジェクトに永続化したくないフィールドがある場合は、 @Transient
アノテーションを指定できます。
メソッドの定義
メソッドの使用に制限はありません。
例
Employee employee = new Employee(); // Entity
Address address = new Address("Tokyo", "Yaesu", "103-0028"); // Embeddable
employee.setAddress(address);