|
| 1 | +========================= |
| 2 | +エンベッダブルクラス |
| 3 | +========================= |
| 4 | + |
| 5 | +.. contents:: 目次 |
| 6 | + :depth: 3 |
| 7 | + |
| 8 | +Embeddable(エンベッダブル)は、データベースのテーブルやクエリの結果セット複数カラムをグループ化します。 |
| 9 | + |
| 10 | +エンベッダブル定義 |
| 11 | +========================= |
| 12 | + |
| 13 | +エンベッダブルクラスは ``@Enbeddable`` を注釈して示します。 |
| 14 | +コンストラクタには永続的なフィールドに対応するパラメータが必要です。 |
| 15 | + |
| 16 | +.. code-block:: java |
| 17 | +
|
| 18 | + @Embeddalbe |
| 19 | + public class Address { |
| 20 | +
|
| 21 | + private final String city; |
| 22 | +
|
| 23 | + private final String street; |
| 24 | +
|
| 25 | + @Column(name = "ZIP_CODE") |
| 26 | + private final String zip; |
| 27 | +
|
| 28 | + public Address(String city, String street, String zip) { |
| 29 | + this.city = city; |
| 30 | + this.street = street; |
| 31 | + this.zip = zip; |
| 32 | + } |
| 33 | + } |
| 34 | +
|
| 35 | +エンベッダブルクラスは :doc:`../entity` のフィールドとして使用します。 |
| 36 | + |
| 37 | +.. code-block:: java |
| 38 | +
|
| 39 | + @Entity |
| 40 | + public class Employee { |
| 41 | + @Id |
| 42 | + private final Integer id; |
| 43 | +
|
| 44 | + private final Address address; |
| 45 | + } |
| 46 | +
|
| 47 | +テーブルや結果セットとのマッピングにおいて、上記のクラス定義は下記のクラス定義と同等です。 |
| 48 | + |
| 49 | +.. code-block:: java |
| 50 | +
|
| 51 | + @Entity |
| 52 | + public class Employee { |
| 53 | + @Id |
| 54 | + private final Integer id; |
| 55 | +
|
| 56 | + private final String city; |
| 57 | +
|
| 58 | + private final String street; |
| 59 | +
|
| 60 | + @Column(name = "ZIP_CODE") |
| 61 | + private final String zip; |
| 62 | + } |
| 63 | +
|
| 64 | +
|
| 65 | +ネーミング規約 |
| 66 | +--------------------------- |
| 67 | + |
| 68 | +ネーミング規約は、エンベッダブルクラスを保有する :doc:`../entity` から引き継ぎます。 |
| 69 | + |
| 70 | +フィールド定義 |
| 71 | +================== |
| 72 | + |
| 73 | +エンベッダブルクラスのフィールドはデフォルトで永続的です。 |
| 74 | +つまり、テーブルや結果セットのカラムに対応します。 |
| 75 | +フィールドの型は次のいずれかでなければいけません。 |
| 76 | + |
| 77 | +* :doc:`basic` |
| 78 | +* :doc:`domain` |
| 79 | +* :doc:`basic` または :doc:`domain` のいずれかを要素とするjava.util.Optional |
| 80 | +* java.util.OptionalInt |
| 81 | +* java.util.OptionalLong |
| 82 | +* java.util.OptionalDouble |
| 83 | + |
| 84 | +.. code-block:: java |
| 85 | +
|
| 86 | + @Embeddalbe |
| 87 | + public class Address { |
| 88 | + ... |
| 89 | + String street; |
| 90 | + } |
| 91 | +
|
| 92 | +カラム |
| 93 | +------------------ |
| 94 | + |
| 95 | +カラム情報を指定するには、 ``@Column`` を使用します。 |
| 96 | + |
| 97 | +.. code-block:: java |
| 98 | +
|
| 99 | + @Column(name = "ZIP_CODE") |
| 100 | + private final String zip; |
| 101 | +
|
| 102 | +識別子 |
| 103 | +------ |
| 104 | + |
| 105 | +エンベッダブルクラスには識別子(主キー)を定義できません。 |
| 106 | + |
| 107 | +バージョン |
| 108 | +------------------ |
| 109 | + |
| 110 | +エンベッダブルクラスには楽観的排他制御用のバージョンを定義できません。 |
| 111 | + |
| 112 | +非永続的なフィールド |
| 113 | +-------------------------------- |
| 114 | + |
| 115 | +非永続的なフィールドは、``@Transient`` を注釈して示します。 |
| 116 | + |
| 117 | +取得時の状態を管理するフィールド |
| 118 | +-------------------------------------------- |
| 119 | + |
| 120 | +エンベッダブルクラスには取得時の状態を管理するフィールドを定義できません。 |
| 121 | + |
| 122 | +メソッド定義 |
| 123 | +================== |
| 124 | + |
| 125 | +メソッドの定義に制限はありません。 |
| 126 | + |
| 127 | +フィールドの可視性を ``protected`` やパッケージプライベートにして ``public`` なメソッド経由で |
| 128 | +アクセスすることも、メソッドを一切使用せず ``public`` フィールドに直接アクセスすること |
| 129 | +もどちらもサポートされています。 |
| 130 | + |
| 131 | +利用例 |
| 132 | +================== |
| 133 | + |
| 134 | +インスタンス化して利用します。 |
| 135 | + |
| 136 | +.. code-block:: java |
| 137 | +
|
| 138 | + Employee employee = new Employee(); // エンティティ |
| 139 | + Address address = new Address("Tokyo", "Yaesu", "103-0028"); // エンベッダブル |
| 140 | + employee.setAddress(address); |
| 141 | +
|
0 commit comments