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
    例)メンバー名を変更する場合、他のメンバーの名前も一緒に変更できません.

    📌 埋め込みタイプ(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を作成します.
    🔎 組み込みの使用方法
  • @Embeddable:値タイプを定義すると
  • と表示されます.
  • @Embedded:
  • を使用値タイプで表示
  • 基本ジェネレータは
  • が必要である.
    @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;
    
    }
    🔎 埋め込みタイプとテーブルマッピング
  • imbeddyタイプは、エンティティの値にすぎません.
  • imbeddyタイプを使用して前後にマッピングされたテーブルは同じです.
  • オブジェクトおよびテーブルは、非常に細かくマッピングすることができる.
  • 🔎 埋め込みタイプに関連

    埋め込みタイプには値タイプが含まれ、エンティティを参照できます.
    🔎 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;
    	}
    }
    
    不変の小さな制約によって、副作用という大きな災難を防ぐことができる.