Chapter9. 값 타입

김신영·2022년 12월 6일
0

JPA

목록 보기
7/14
post-thumbnail

JPA 데이터 타입

1. Entity Type

  • 식별자가 있다. (@Id)
  • 생명 주기가 있다.
  • 공유할 수 있다. (참조 객체)

2. Value Type

  • 식별자가 없다
  • 생명 주기는 속해있는 엔티티에 의존한다.
  • 공유하는 것은 위험하다.

Value Type

  • 기본 값 타입
    - Primitive Type (int, long, double)
    - Wrapper Class (Integer, Long, Double)
    - String
  • 임베디드 타입
  • 컬렉션 값 타입

임베디드 타입

@Embedded

값 타입을 정의하는 곳에 표시

@Embeddable

값 타입을 사용하는 곳에 표시

  • 임베디드 타입은 기본 생성자가 필수
  • 임베디드 타입의 값이 null일 경우, 임베디드 타입 안 모든 매핑 칼럼 값이 null이 된다.
  • 임베디드 타입을 여러 엔티티에서 공유하면 위험하다.
@Entity
@Table(name = "MEMBERS")
public class Member {
	@Id
	@GeneratedValue
	private Long id;
	
	private String name;

	@Embedded
	private Period period;

	@Embedded
	private Address address;
}

@Embeddable
public class Period {  
  
    private LocalDate startDate;  
  
    private LocalDate endDate;  
}

@Embeddable
public class Address {  
  
    @Column(length = 100)  
    private String city;  
  
    private String street;  
  
    @Column(length = 100)  
    private String zipCode;
}

@AttributeOverride

매핑 정보 재정의

@Entity
@Table(name = "MEMBERS")
public class Member {
	@Id
	@GeneratedValue
	private Long id;
	
	private String name;

	@Embedded
	private Period period;

	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name = "city", column = @Column(name = "COMPANY_CITY")),
		@AttributeOverride(name = "street", column = @Column(name = "COMPANY_STREET")),
		@AttributeOverride(name = "zipCode", column = @Column(name = "COMPANY_ZIPCODE"))
	})
	private Address address;
}

값 타입 컬렉션

  • @ElementCollection

  • @CollectionTable

  • 값 타입 컬렉션은 기본적으로 영속성 전이(Cascade), 고아 객체 제거 (Orphan Remove) 기능이 설정된다.

  • 값 타입 컬렉션에 변경 사항이 발생하면, 매핑된 테이블 전체를 삭제한 후 다시 저장한다.

  • 값 타입 컬렉션과 매핑된 테이블은 모든 컬럼을 묶어서 기본 키로 구성해야 한다.

  • 그냥 @OneToMany 를 활용하는 것을 추천.

@Entity
@Table(name = "MEMBERS")
public class Member {
	@Id
	@GeneratedValue
	private Long id;

	@Embedded
	private Address address;

	@ElementCollection
	@CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
	private Set<String> favoriteFoods = new HashSet<>();

	@ElementCollection
	@CollectionTable(name = "ADDRESS_HISTORY", joinColumns = @JoinColumn(name = "MEMBER_ID"))
	private List<Address> addressHistory = new ArrayList<>();
}

profile
Hello velog!

1개의 댓글

comment-user-thumbnail
2023년 2월 16일
답글 달기