티스토리 뷰

WEB/기타

[JPA] 3. Entity - 연관관계 매핑

silverline79 2024. 1. 20. 00:05

연관관계 매핑

객체의 참조와 테이블의 외래 키를 매핑

방향(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을 넣어줌
@JoinColumnDefult 값이 있긴 하지만 name을 정해줌
여기까지 매핑하면 단방향 관계가 된다.
반대편에 mappedBy를 적용시켜주면 일대일 양방향 관계매핑이 된다.
mappedBy="locker"Member엔티티티에 있는 Locker 필드와 매핑 되었다는 것을 의미함.
member 필드는 읽기 전용 필드이다.

 

@OneToMany 일대다 관계 매핑[1:N]

속성 설명 기본값
mappedBy 연관관계의 주인 필드를 선택
fetch 글로벌 페치 전략을 설정 @ManyToOne=FetchType.EAGER@OneToMany=FetchType.LAZY
cascade 속성 전이 기능을 사용
targetEntity 연관된 엔티티의 타입 정보를 설정
이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다.

 

FetchTypeLAZYEAGER

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 insertableupdatablecolumnDenitiontable @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
댓글