33.実戦例(値タイプマッピング)


33.実戦例(値タイプマッピング)


次の例のメンバー、成果物には、アドレス情報がリストされています.
  • 値タイプ適用前
  • public class Member {
        ...
        private String city;
        private String street;
        private String zipcode;
        ...
    }
    
    public class Delivery {
        ...
        private String city;
        private String street;
        private String zipcode;
        ...
    }
    次の例では、Addressという名前の値タイプを作成し、リストされたアドレスを使用するように変更します.次の図は、値タイプを使用した結果UMLです.
  • 値タイプアドレス
  • package jpabook.model.entity;
    
    import javax.persistence.Embeddable;
    
    @Embeddable
    public class Address {
    
        private String city;
        private String street;
        private String zipcode;
        
        // Getter, Setter
        // Equals, hashCode
        ...
    }
    値タイプを
  • メンバー(メンバー)
  • に適用
    
    package jpabook.model.entity;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    public class Member {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        private String name;
        
        // private String city;          // 삭제
        // private String street;        // 삭제
        // private String zipcode;       // 삭제
    
        @Embedded                        // 추가
        private Address address;         // 추가
    
        @OneToMany(mappedBy = "member")
        private List<Order> orders = new ArrayList<Order>();
        ...
    }
    値タイプは
  • デリバリに適用されます
    package jpabook.model.entity;
    
    
    import javax.persistence.*;
    
    @Entity
    public class Delivery {
    
        @Id @GeneratedValue
        @Column(name = "DELIVERY_ID")
        private Long id;
    
        @OneToOne(mappedBy = "delivery")
        private Order order;
        
        // private String city;          // 삭제
        // private String street;        // 삭제
        // private String zipcode;       // 삭제
    
        @Embedded                        // 추가
        private Address address;         // 추가
    
        @Enumerated(EnumType.STRING)
        private DeliveryStatus status; //ENUM [READY(준비), COMP(배송)]
        ...
    }
    上記の例のAddress値タイプを作成し、上記の例(メンバーに値タイプを適用)と上記の例(出荷に値タイプを適用)のDeliveryエンティティに適用します.アドレス情報にフィールドまたは論理を追加する場合は、アドレス値のタイプを変更するだけです.
    リファレンス
  • Java ORM標準JPAプログラミング