티스토리 뷰
◆ 연관관계 매핑
객체의 참조와 테이블의 외래 키를 매핑
방향(Direction) : 단방향, 양방향 / 방향은 객체 관계에만 존재하고 테이블 관계는 항상 양방향
다중성(Multiplicity) : 다대일, 일대다, 일대일, 다대다
@ManyToOne 다대일 관계 매핑 [N:1]
연관관계 매핑시 다중성 어노테이션은 필수
속성 | 설명 | 기본값 |
optional | false로 설정하면 연관된 엔티티가 항상 있어야 함 | true |
fetch | 글로벌 패치 전략을 설정 | @ManyToOne=FetchType.EAGER@OneToMany=FetchType.LAZY |
cascade | 속성 전이 기능을 사용 | |
targetEntity | 연관된 엔티티의 타입 정보를 설정 이 기능은 거의 사용하지 않는다 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다. |
@ManyToMany 다대다 관계 매핑 [N:M]
사용하지 않는 것을 추천이유) 매핑 정보만 넣는 것이 가능하고, 추가 정보를 넣는 것 자체가 불가능중간테이블이 숨겨져 있으므로 예상하지 못한 쿼리가 발생하는 경우가 생길 수 있음.
RDB에서는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.그대신, 연결 테이블(조인 테이블)을 중간에 추가하여 일대다, 다대일 관계를 이용해야 함
@OneToOne 일대일 관계 매핑[1:1]
일대일 관계는 그 반대도 일대일이다.
일대일관계는 특이하게 주 테이블이나 대상 테이블 중에 외래키를 넣을 테이블을 선택 가능 하다.
주 테이블에 왜래키 저장
대상 테이블에 외래 키 저장
외래키에 데이터 베이스 유니크 제약조건 추가되어야 일대일 관계가 된다.
@Entity public class Member{ @OneToOne @JoinColumn(name="locker_id") private Locker locker;} |
@Entity public class Locker{ @OneToOne(mappedBy="locker") private Member member; } |
@OneToOne 어노테이션으로 일대일 단방향 관계를 매핑하고, @JoinColumn을 넣어줌 @JoinColumn은 Defult 값이 있긴 하지만 name을 정해줌 여기까지 매핑하면 단방향 관계가 된다. |
반대편에 mappedBy를 적용시켜주면 일대일 양방향 관계매핑이 된다. mappedBy="locker"는 Member엔티티티에 있는 Locker 필드와 매핑 되었다는 것을 의미함. 이 member 필드는 읽기 전용 필드이다. |
@OneToMany 일대다 관계 매핑[1:N]
속성 | 설명 | 기본값 |
mappedBy | 연관관계의 주인 필드를 선택 | |
fetch | 글로벌 페치 전략을 설정 | @ManyToOne=FetchType.EAGER@OneToMany=FetchType.LAZY |
cascade | 속성 전이 기능을 사용 | |
targetEntity | 연관된 엔티티의 타입 정보를 설정 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다. |
FetchType의 LAZY와 EAGER
LAZY
지연로딩
연관관계가 설정된 테이블에 대해 select를 하지 않는다.
1:N 과 같이 여러 가지 데이터가 로딩이 일어날 경우 사용하는 방식
EAGER
즉시로딩
연관관계가 설정된 모든 테이블에 대해 조인이 이루어진다.
1:1 연관관계와 같이 한 건만 존재할 때 사용하는 방식
@JoinTable 테이블과 테이블 사이에 별도의 조인 테이블을 만들어 양 테이블간의 연관관계 설정
속성 | 설명 | 예시 |
name | 조인 테이블명 | name ="TB_CMN_POST_TAG" |
JoinColumns | 현재 엔티티를 참조하는 외래키 | joinColumns=@JoinColumn(name="post_id") |
inverseJoinColumns | 반대방향 엔티티를 참조하는 외래키 | inverseJoinColumn=@JoinColumn(name="tag_name") |
@JoinColumn 외래 키 매핑할 때 사용
속성 | 설명 | 기본값 |
name | 매핑할 외래 키 이름 | 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 |
referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본 키 컬럼명 |
foreignKey(DDL) | 외래 키 제약조건을 직접 지정할 수 있다.이 속성은 테이블을 생성할 때만 사용한다. | |
uniquenullable insertableupdatablecolumnDefinitiontable | @Column의 속성과 같다. |
@Enumerated
열거타입에 대한 매핑은 @Enumerated 어노테이션을 사용
@Enumerated(EnumType.STRING) : @Enumerated 어노테이션으로 설정한 열거형을 DB로 저장할 때 어떤 값으로 저장할지 결정
@Basic
@Id 어노테이션을 제외한 나머지 영속 대상은 @Basic 어노테이션을 사용
@Basic 어노테이션이 보이지 않는데 생략된 것
'WEB > 기타' 카테고리의 다른 글
[JPA] 5. Repository query keywords (0) | 2024.01.23 |
---|---|
[JPA] 4. Repository (0) | 2024.01.23 |
[JPA] 3. Entity - 설정, 속성 (0) | 2024.01.20 |
[JPA] 2. JPA 사용 설정 (0) | 2024.01.20 |
[JPA] 1. JPA (Java Persistence API) 란? (0) | 2024.01.20 |
- Total
- Today
- Yesterday
- Hibernate #ORM
- 세방고딕체 #웹폰트 #무료폰트 #무료웹폰트 #디자인폰트 #이벤트폰트 #디자인폰트 #타이틀용폰트
- JDBC #DBMS
- SELECTANY #SELECTALL
- DTO #Entity
- jQuery #jQuery이미지슬라이드 #이미지슬라이드
- 이벤트폰트 #이벤트용폰트 #디자인폰트 #디자인서체 #웹폰트
- Thymeleaf #타임리프
- JPA #
- ORM종류
- JPA #JPARepository
- 무료폰트 #무료웹폰트 #평창평화체 #평화체 #이벤트용서체 #이벤트서체 #디자인폰트
- S-CoreDream
- SELETE
- SQL #SQLJOIN #JOIN #INNERJOIN #OUTERHJOIN
- thymeleaf
- JPA #JPA설정
- DB #DBCREATE #DBDROP #DBBAKUP
- JPA #JPAEntity #JPA연관관계
- S-Core
- 프리텐다드폰트 #고딕폰트 #무료폰트 #타이틀용폰트 #고딕 #웹폰트 #디자인폰트
- SQL #TABLE생성 #SQL제약조건
- JPA #JPAEntity
- SQL명령어 #SQL
- 지마켓산스(Gmarket Sans)체 #지마켓산스 #Gmarketfont #GmarketSans #무료폰트 #타이틀폰트 #디자인폰트 #웹폰트
- 나눔폰트 #네이버글꼴 #네이버폰트 #고딕폰트 #본문폰트 #제목폰트 #무료폰트 #디자인폰트 #웹폰트
- JPA Repository query keywords
- JPA Auditing #JPA
- SQL #INSERTINTO #DELETE #UPDATE
- 카페24폰트 #무료폰트 #무료웹폰트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |