Java ORM標準JPAプログラミング-基本編(11)
この文章はJava ORM標準JPAプログラミング-基本編課を聞いて整理した内容です.
デフォルトタイプ 埋め込み式(複合型) 値タイプおよび不変オブジェクト JPAは2種類のデータ型を分類する.
1.エンティティタイプ
Entityとして定義されたオブジェクト
データが変化しても、識別子として追跡できます.
たとえば、メンバーエンティティのキー値または年齢値を変更すると、識別子として認識できます.
2.価格タイプ
Java基本タイプまたはオブジェクト( int、Integer、Stringなど)
識別子なし、値のみのため、変更を追跡できません.
たとえば、数値100を200に変更すると、まったく異なる値で置き換えられます. 値タイプの分類
1)デフォルトのタイプ
2)組み込み
3)集合値タイプ Java基本タイプ(int,double)、Rapperクラス(Integer,Long)、String ライフサイクルはエンティティに依存します.
たとえば、メンバーを削除すると、名前と年齢フィールド が同時に削除されます.値タイプ共有時X
例)メンバー名を変更する場合、他のメンバーの名前も一緒に変更できません.
は、新しい値タイプを直接定義することができる. 州のデフォルト値タイプを組み合わせたもので、複合値タイプとも呼ばれます.
しかし、開始日と郵便番号には関連性がなく、会員が詳細なデータを持っている場合、凝集力に欠け、対象向けのコードではない.
これをimbeddyタイプとして用いると高い凝集度を示す.
PeriodクラスとAddressクラスを作成し、これらのフィールドにdate、city、street、zipcodeを作成します.
🔎 組み込みの使用方法@Embeddable:値タイプを定義すると と表示されます.@Embedded: を使用値タイプで表示基本ジェネレータは が必要である.
imbeddyタイプは、エンティティの値にすぎません. imbeddyタイプを使用して前後にマッピングされたテーブルは同じです. オブジェクトおよびテーブルは、非常に細かくマッピングすることができる. 🔎 埋め込みタイプに関連
埋め込みタイプには値タイプが含まれ、エンティティを参照できます.
🔎 1つのエンティティで同じ値タイプを使用する場合?
重複するコラム名はエラーの原因となります.@AttributeOverrides,@AttributeOverrideを使用して、色名属性を再定義する方法で解決します.
🔎 埋め込みタイプとnull
imbeddyタイプの値がnullの場合、マッピングされたすべてのカラム値がnullになります.
値タイプは、複雑なオブジェクトの世界を単純化するために作成された概念です.したがって、価格タイプは簡単で安全でなければなりません.
🔎 共有値タイプを参照
複数のエンティティでimbeddyタイプのような値タイプを共有すると危険です.
メンバー1のcity値をNew Cityに変更した場合、どうなりますか?
メンバー1のcity値は変更されましたが、メンバー2の値も変更されました.
メンバー1とメンバー2は同じAddressを参照しているからです!
🔎 値タイプのコピー
共有値タイプの実際のインスタンス値は危険です.逆に、値(インスタンス)をコピーして使用できます!
🔎 オブジェクトタイプの制限
共有参照による副作用を回避するために、値を頻繁にコピーします.問題は、imbeddyタイプのように、直接定義された値タイプはjavaのデフォルトタイプではなく、オブジェクトタイプです.
Java基本タイプに値を代入すると、値がコピーされます.
オブジェクトタイプは、直接参照値をブロックできません.オブジェクトの共有参照は避けられません.
🔎 不変オブジェクト:作成時から値を絶対に変更できないオブジェクト
オブジェクトをそのままにしておくと、値を変更できないため、副作用を完全に防ぐことができます.値タイプは、不変オブジェクト(immutable object)として設計する必要があります.モディファイヤを作成せずに値をジェネレータに設定するだけです.
📌 値のタイプ
1.エンティティタイプ
Entityとして定義されたオブジェクト
データが変化しても、識別子として追跡できます.
たとえば、メンバーエンティティのキー値または年齢値を変更すると、識別子として認識できます.
2.価格タイプ
Java基本タイプまたはオブジェクト(
識別子なし、値のみのため、変更を追跡できません.
たとえば、数値100を200に変更すると、まったく異なる値で置き換えられます.
1)デフォルトのタイプ
2)組み込み
3)集合値タイプ
📌 デフォルトのタイプ
たとえば、メンバーを削除すると、名前と年齢フィールド
例)メンバー名を変更する場合、他のメンバーの名前も一緒に変更できません.
📌 埋め込みタイプ(embeddedタイプ、複合値タイプ)
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipcode;
}
メンバーエンティティには、開始日、終了日、都市、街道、郵便番号があります.しかし、開始日と郵便番号には関連性がなく、会員が詳細なデータを持っている場合、凝集力に欠け、対象向けのコードではない.
これをimbeddyタイプとして用いると高い凝集度を示す.
PeriodクラスとAddressクラスを作成し、これらのフィールドにdate、city、street、zipcodeを作成します.
🔎 組み込みの使用方法
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
}
🔎 埋め込みタイプとテーブルマッピング埋め込みタイプには値タイプが含まれ、エンティティを参照できます.
🔎 1つのエンティティで同じ値タイプを使用する場合?
重複するコラム名はエラーの原因となります.@AttributeOverrides,@AttributeOverrideを使用して、色名属性を再定義する方法で解決します.
@Embedded
Private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name=“city”,column=@Column(“WORK_CITY”)),
@AttributeOverride(name=“street”, column=@Column(“WORK_STREET”)),
@AttributeOverride(name=“zip code”, column=@Column(“WORK_ZIPCODE”))
Private Address workAddress;
🔎 埋め込みタイプとnull
imbeddyタイプの値がnullの場合、マッピングされたすべてのカラム値がnullになります.
📌 値タイプと不変オブジェクト
値タイプは、複雑なオブジェクトの世界を単純化するために作成された概念です.したがって、価格タイプは簡単で安全でなければなりません.
🔎 共有値タイプを参照
複数のエンティティでimbeddyタイプのような値タイプを共有すると危険です.
メンバー1のcity値をNew Cityに変更した場合、どうなりますか?
メンバー1のcity値は変更されましたが、メンバー2の値も変更されました.
メンバー1とメンバー2は同じAddressを参照しているからです!
🔎 値タイプのコピー
共有値タイプの実際のインスタンス値は危険です.逆に、値(インスタンス)をコピーして使用できます!
Address copyAddress = new Address(adress.getCity(), adress.getStreet(), address.getZipcode());
Member member2 = new Member();
member2.setName(“name”);
member2.setHomeAddress(copyAddress);
em.persist(member2);
member.getHomeAddress().setCity(“newCity”)
🔎 オブジェクトタイプの制限
共有参照による副作用を回避するために、値を頻繁にコピーします.問題は、imbeddyタイプのように、直接定義された値タイプはjavaのデフォルトタイプではなく、オブジェクトタイプです.
Java基本タイプに値を代入すると、値がコピーされます.
オブジェクトタイプは、直接参照値をブロックできません.オブジェクトの共有参照は避けられません.
🔎 不変オブジェクト:作成時から値を絶対に変更できないオブジェクト
オブジェクトをそのままにしておくと、値を変更できないため、副作用を完全に防ぐことができます.値タイプは、不変オブジェクト(immutable object)として設計する必要があります.モディファイヤを作成せずに値をジェネレータに設定するだけです.
@Embeddable
public class Address {
@Column
private String city;
protected Adress() {
}
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
}
不変の小さな制約によって、副作用という大きな災難を防ぐことができる.Reference
この問題について(Java ORM標準JPAプログラミング-基本編(11)), 我々は、より多くの情報をここで見つけました https://velog.io/@uuuuu_j_/자바-ORM-표준-JPA-프로그래밍-기본편-11テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol