Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
9.1 기본값 타입
JPA 값 타입은 크게 3가지로 구분
- 기본값 타입 (basic value type)
- 자바 기본 타입(int, double)
- 래퍼 클래스(Integer)
- String
- 임베디드 타입(embedded type) / 복합 값 타입
- 컬렉션 타입(collection value type)
9.1 기본 값 타입
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
private int age;
...
}
- Member 엔티티의 name, age와 같이 식별자 값도 없고 생명주기도 회원 엔티티에 의존하는 값
9.2 임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의해서 사용 가능, JPA에선 이것을 임베디드 타입이란 단어로 사용
- 객체지향적으로 묶을 수 있는 객체를 @Embedded를 통해 임베디드 타입으로 사용
임베디드 타입을 적용한 회원 엔티티
@Entity public class Member { ... @Embedded Period workPeriod; //근무 기간 @Embedded Address homeAddress; //집 주소 ... }
기간 임베디드 타입
@Embeddable public class Period { @Temporal(TemporalType.DATE) java.util.Date startDate; @Temporal(TemporalType.DATE) java.util.Date endDate; ... }
주소 임베디드 타입
@Embeddable public class Address { @Column(name="city") //매핑 컬럼 정의 가능 private String city; private String street; private String zipcode; ... }
- 임베디드 타입을 사용하려면 2가지 어노테이션이 필요, 둘 중 하나는 생략 가능
- @Embeddable: 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
9.2.1 임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 동일
- 임베디드 타입으로 테이블을 세밀하게 매핑이 가능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 많음
9.2.2 임베디드 타입과 연관관계
임베디드 타입과 연관관계
@Entity
public class Member {
@Embedded Address address; //임베디드 타입 포함
@Embedded PhoneNumber phoneNumber; //임베디드 타입 포함
}
@Embeddable
public class Address {
...
@Embedded Zipcode zipcode; //임베디드 타입 포함
}
@Embeddable
public class Zipcode {
String zip;
String plusFour;
}
@Embeddable
public class PhoneNumber {
String areaCode;
String localNumber;
@ManyToOne PhoneEntity provider; //엔티티 참조
}
@Entity
public class PhoneEntity {
@Id String name;
...
}
- Address가 값 타입인 Zipcode를 포함
- PhoneNumber가 엔티티 타입인 PhoneEntity를 참조
9.2.3 @AttributeOverride: 속성 재정의
- 임베디드 타입에 매핑정보를 재정의할 때 @AttributeOverride를 사용
같은 임베디드 타입을 갖는 회원
@Entity public class Member { @Id @GeneratedValue private Long id; ... @Embedded Address homeAddress; @Embedded Address companyAddress; }
임베디드 타입 재정의
@Entity public class Member { @Id @GeneratedValue private Long id; ... @Embedded Address homeAddress; @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")) }) Address companyAddress; } //생성 테이블 DDL CREATE TABLE MEMBER ( COMPANY_CITY varchar(255), COMPANY_STREET varchar(255), COMPANY_ZIPCODE varchar(255), city varchar(255), street varchar(255), zipcode varchar(255), ... )
9.2.4 임베디드 타입과 null
- 임베디드 타입이 null이면 매핑한 컬럼 값은 모두 null
member.setAddress(null); //null 입력 em.persist(member); //city, street, zipcode 컬럼 모두 null
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 10.1 객체체지향 쿼리 소개 (0) | 2021.09.13 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 9.3~5 값 타입과 불변 객체, 값 비교, 값 타입 컬렉션 (0) | 2021.09.13 |
[자바 ORM 표준 JPA 프로그래밍] 8.4~5 영속성 전이, 고아 객체 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.3 지연 로딩 활용 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.1~2 프록시, 즉시 로딩과 지연 로딩 (0) | 2021.08.25 |