값 타입

기본 타입

  • vendor에 맞는 타입으로 매칭된다.

embedded 타입

  • 객체 형태로 composition(Has-A) 관계인 경우를 의미한다.
    @Embeddable
    class Address {
      private String address;
      private String detail;
      private String zipCode;
    }
    @Entity
    class A {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
      @Embedded
      private Address addressSet;
    }
    
  • @Embeddable: 값 타입 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • @AttributeOverride(s)로 속성을 재정의할 수도 있다.
  • 값 타입이 null이면 내부 필드에 매핑된 테이블 컬럼이 모두 null이 된다.
  • 값 타입은 공유 참조가 되면 꽤 위험하다. copy해서 넘기는 방법이 최선이다.
  • 최대한 불변객체로 만들어야 한다.

값 타입 컬렉션

  • 값을 하나 이상 저장하려면 Collection에 보관하고 @ElementCollection, @CollectionTable을 사용하면 된다.
@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;
    
    @ElementCollection
    @CollectionTable (name = "FAVORITE_FOODS", joinColumns = @JoinColumn (name = "MEMBER_ID") )
    @Column (name="FOOD_NAME" )
    private Set<String> favoriteFoods = new HashSet<String>() ;
    
    @ElementCollection
    @CollectionTable (name = "ADDRESS", joinColumns = @JoinColumn (name = "MEMBER_ID") )
    private List<Address> addressHistory = new ArrayList<Address> () ;
}
  • 값 타입 컬렉션은 cascade, orphan removal을 모두 가진다고 보면 된다.