Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 스프링
- 그리디
- Exception
- Android
- pointcut
- db
- JPQL
- QueryDSL
- AOP
- springdatajpa
- transaction
- Greedy
- 김영한
- kotlin
- JDBC
- 백준
- Thymeleaf
- jpa
- java
- Spring Boot
- Proxy
- Servlet
- 알고리즘
- spring
- 스프링 핵심 원리
- 인프런
- 스프링 핵심 기능
- SpringBoot
- 자바
- http
Archives
- Today
- Total
개발자되기 프로젝트
임베디드 타입 본문
1. 임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 embedded type이라고 함
- 주로 기본 값 타입을 "모아서" 만들기 때문에 복합 값 타입이라고 함.
- int String과 같은 값 타입임!
2. 예시
- 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.
- 흠.. 공통적인 요소들이 있는데... 묶어보자.
- 회원 엔티티는 이름, 근무기간, 주소를 가진다.
- 이처럼 묶어낼 수 있는게 임베디드 타입임.
- Member의 구성
- 즉, Period, Address라는 클래스를 생성해서 값 타입으로 씀
- 즉, Period, Address라는 클래스를 생성해서 값 타입으로 씀
3. 임베디드 타입 사용 방법
- @Embeddable : 값 타입을 정의하는 곳에 사용
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본생성자 필수~~
4. 임베디드 타입의 장점
- 재사용이 좋음
- 높은 응집도
- Period.isWork()처럼 해당 값 타임만 사용하는 의미있는 메서드를 만들 수도 있음 .
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함.
5. 임베디드 타입과 테이블 매핑
- 임베디드 타입을 쓰든 안쓰든 테이블에서는 바뀌는게 없어
- 단지 매핑만 좀 달라짐 ㅋㅋㅋ
- 임베디드 타입은 엔티티의 값일 뿐!! 그냥 값임!
- 임베디드 타입을 사용하기 전 후 매핑하는 테이블은 같음
- 객체와 테이블을 아주 세밀하게(find-grained)매핑하는 것이 가능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수 보다 클래스의 수가 더 많음. ㄷ
6. 예시
- Address
@Embeddable public class Address { private String city; private String street; private String zipcode; public Address() { } public Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } }
- Period
@Embeddable public class Period { //기간 private LocalDateTime startDate; private LocalDateTime endDate; public Period() { } }
- Member
@Entity public class Member { //기간 @Embedded private Period period; //주소 @Embedded private Address address; }
- Test
Member member = new Member();
member.setUserName("a");
member.setAddress(new Address("city", "street", "321654"));
member.setPeriod(new Period());
em.persist(member);
tx.commit();
7. 임베디드 타입과 연관관계
- 임베디드는 임베디드를 가질 수 있음.
- 임베디드가 엔티티를 가질 수 있음....? FK만 들고 있으면됨 ㅋㅋㅋㅋ 쌉가능
-
@Embeddable public class Address { private String city; private String street; private String zipcode; //임베디드는 엔티티를 가질 수 있음. private Member member; }
-
8. @AttributeOverride : 속성 재정의
- 한 엔티티에서 같은 값 타입을 여러 번 사용하면..?
- 컬럼 명이 중복됨...ㅠㅠ
- @AttributeOverrides, @AttributeOverride를 사용해서 컬럼명 속성을 재 정의가능.
요렇게 중복되게 쓰면 어떻게 될까?
//주소
@Embedded
private Address address;
//주소
@Embedded
private Address homeAddress;
예외 터진다 ㅋㅋㅋㅋㅋㅋ
.MappingException: Could not determine type for: hellojpa.Member, at table: Member, for columns: [org.hibernate.mapping.Column(member)]
- @AttributeOverride 쓰자!
- 임베디드의 각 항목에 대해서 column 명을 별도로 지정하면된다.
@Embedded @AttributeOverrides({ @AttributeOverride(name = "city", column = @Column(name = "HOME_CITY")), @AttributeOverride(name = "street", column = @Column(name = "HOME_STREET")), @AttributeOverride(name = "zipcode", column = @Column(name = "HOME_ZIPCODE")) }) private Address homeAddress;
-
Hibernate: /* insert hellojpa.Member */ insert into Member (city, street, zipcode, HOME_CITY, HOME_STREET, HOME_ZIPCODE, endDate, startDate, TEAM_ID, USERNAME, MEMBER_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- 임베디드의 각 항목에 대해서 column 명을 별도로 지정하면된다.
9. 임베디드 타입과 null
- 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null
10. GitHub : 210812 Embedded Type
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
값 타입 비교 (0) | 2021.08.13 |
---|---|
값 타입과 불변 객체 (0) | 2021.08.13 |
기본 값 타입 (0) | 2021.08.12 |
[예제] 연관관계 관리 (0) | 2021.08.12 |
영속성 전이(CASCADE),고아 객체 (0) | 2021.08.12 |
Comments