반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.
* 다른 테이블에 값을 저장할 때
- DB 설계 중에는 여러 테이블에 관련된 값을 저장할 때가 있다.
- writer와 관련된 데이터를 writer_intro와 writer_address에 나눠 저장할 수 있다.
- 이 세개의 테이블을 자바 코드로 모델링 하면 오른쪽과 같이 세 개의 클래스를 이용해 구현할 수 있다.
- Intro와 Address는 데이터를 지닌 값의 형태로 존재할 수 있다.
- @Embeddable로 엔티티인 Writer에 Intro와 Address를 매핑할 수 있다.
* 방법1 - @SecondaryTable + 테이블명
- Intro클래스는 @Embeddable을 사용하지만 @Column에 table = "writer_intro" 태그가 추가됐다.
- 이는 Intro는 Embeddable이긴 하지만 writer_intro라는 이름의 테이블로 사용할 것이다. 라는 의도를 명시해주는 것이다.
- 이후 Intro를 Embedded할 Writer 클래스에 @SecondaryTable 애노테이션을 추가하고 name = "writer_intro"를 추가해준다.
- 또한 pkJoinColumns를 지정해주어야 한다. 이는 writer_intro 테이블에서 writer 테이블을 참조할 때 참조할 칼럼의 이름을 지정한다.
- 해당 예시에서는 writer_intro의 "writer_id" 컬럼은 writer의 "id" 칼럼을 참조함을 명시하고 있다.
* 방법2 - @SecondaryTable + @AttributeOverride
- Address 클래스는 여러 곳에서 사용될 수 있다. 따라서 @Column 에 테이블 이름을 지정하기는 어렵다.
- @SecondaryTable은 동일하게 사용한다.
- @AttributeOverride를 사용할 때, @Column에 table = "writer_address"와 같이 테이블도 함께 지정해준다.
* 저장
- Writer 객체를 만들 때 Address, Intro를 argument로 넣어준다.
- 그러면 각각의 테이블에 insert를 한다.
* 조회
- 관련된 테이블은 모두 left join으로 join해서 읽어온다.
- inner join을 사용하면 null 일 때 조회가 불가능하다.
* 변경
- Address를 setAddress(@param)를 통해 변경한다고 하자.
- 기존 address가 null이 아니면 바로 update를 한다.
- 기존 address가 null이면 insert 문을 실행한다.
- parameter로 null 을 넘겼는데 기존 address가 null 이 아니면 delete를 이용해서 삭제한다.
* 삭제
- 삭제를 할 때는 본체인 writer뿐만 아니라 Embeddable 로 매핑된 다른 테이블도 delete처리한다.
* 정리
- SecondartTable
- 다른 테이블에 저장된 데이터를 @Embeddable로 매핑 가능하다.
- 다른 테이블에 저장된 데이터가 개념적으로 밸류(값)일 때 사용한다.
- 1-1 관계인 두 테이블을 매핑할 때 종종 출현한다.
반응형
'Programming > JPA & Spring Data JPA 기초' 카테고리의 다른 글
09. 값 콜렉션 List 매핑 (0) | 2023.03.20 |
---|---|
08. 값 콜렉션 Set 매핑 (0) | 2023.03.02 |
06. @Embeddable (0) | 2023.02.27 |
05. 엔티티 식별자 생성 방식 (0) | 2023.02.23 |
04. 엔티티 매핑 설정 (0) | 2023.02.22 |
댓글