엔티티 간의 관계 ( 일대일 , 일대다 , 다대다 ) 를 정의하고 매핑
1. @OneToOne |
- 의도적 중복이 아니라면 사용할 일이 없습니다.
// 일대일 단방향
@Entity
public class Memeber {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker {
@Id
@GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
}
// 일대일 양방향
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
단방향과 양방향의 차이는 연관관계를 맺으려고 하는쪽에 @OneToOne 과 @JoinColumn(name = {"LOCKER_ID"} 을 걸어 주고 ( { } 안은 상대방 컬럼명 ) , 관계가 맺어지는 쪽에 @OneToOne(mappedBy= {"locker"} 이 있으냐 없으냐의 차이입니다.
2. @OneToMany |
- @OneToMany 가 단방향으로 쓰이면 문제가 발생할 수 있습니다.
- 속도를 위해 기본적으로 FetchType 설정이 LAZY 로 설정되어 있습니다.
속성 |
mappedBy : 연관 관계의 주인 필드를 선택합니다. |
fetch : 글로벌 페치 전략 설정 |
cascade : 영속성 전이 기능을 사용합니다. |
targetEntity : 연관된 엔티티의 타입 정보를 설정합니다. |
3. @ManyToOne |
- 다대일 관계를 나타내는 매핑 정보
속성 |
optional (default true) : false 로 설정하면 연관된 엔티티가 반드시 있어야 합니다. |
fetch : 글로벌 패치 전략 설정 ( 기본이 EAGER 로 설정되어 있으나 실무에서는 기본 LAZY로 설정하는 것을 추천 ! ) |
cascade : 영속성 전이 기능 사용 |
targetEntity : 연관된 엔티티의 타입 정보 설정 (targetEntity = Member.class 식으로 사용 ) |
@JoinColumn
- name 속성은 매핑할 외래키의 이름
속성 |
name : 매핑할 외래 키의 이름 |
referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명 |
foreignKey : 외래 키 제약 조건 지정 ( 테이블 생성 시에만 적용됨 ) |
unique / nullable / insertable / updateable / columnDefinition / table ( @Column 의 속성과 같음 ) |
4. @ManyToMany |
- N : M
- 중간 매핑 테이블 ( JoinTable ) 이 자동으로 생성됩니다.
- 중간 매핑 테이블은 JPA 상에서 숨겨져서 ( Entity 정의 없이 ) 관리 됩니다.
- 매핑 테이블 관리가 불가능하여서 실무에서는 잘 사용하지 않는 기능입니다.
- 실무에서는 매핑 테이블을 아래와 같은 형태로 직접 정의합니다.
- TableA(@OneToMany) > MappingTable ( @ManyToOne , @ManyToOne ) > TableB ( @OneToMany )