目次
Embeddable(エンベッダブル)は、データベースのテーブルやクエリの結果セット複数カラムをグループ化します。
エンベッダブルクラスは @Enbeddable
を注釈して示します。 コンストラクタには永続的なフィールドに対応するパラメータが必要です。
@Embeddalbe
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
のフィールドとして使用します。
@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;
}
ネーミング規約は、エンベッダブルクラスを保有する ../entity
から引き継ぎます。
エンベッダブルクラスのフィールドはデフォルトで永続的です。 つまり、テーブルや結果セットのカラムに対応します。 フィールドの型は次のいずれかでなければいけません。
basic
domain
basic
またはdomain
のいずれかを要素とするjava.util.Optional- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
@Embeddalbe
public class Address {
...
String street;
}
カラム情報を指定するには、 @Column
を使用します。
@Column(name = "ZIP_CODE")
final String zip;
エンベッダブルクラスには識別子(主キー)を定義できません。
エンベッダブルクラスには楽観的排他制御用のバージョンを定義できません。
非永続的なフィールドは、@Transient
を注釈して示します。
エンベッダブルクラスには取得時の状態を管理するフィールドを定義できません。
メソッドの定義に制限はありません。
フィールドの可視性を protected
やパッケージプライベートにして public
なメソッド経由で アクセスすることも、メソッドを一切使用せず public
フィールドに直接アクセスすること もどちらもサポートされています。
インスタンス化して利用します。
Employee employee = new Employee(); // エンティティ
Address address = new Address("Tokyo", "Yaesu", "103-0028"); // エンベッダブル
employee.setAddress(address);