2024. 4. 18. 11:16ㆍJAVA/스프링 데이터 JPA
엔티티의 연관관계 매핑 시 고려할 사항
1. 다중성
2. 단방향, 양방향
3. 연관관계의 주인
1. 다대일
연관관계의 주인 : 다쪽
1 - 1) 다대일 단방향 (N : 1)
회원 엔티티
@Entity
public class Member {
...
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
※ 팀 엔티티에는 일반적인 필드와 getter, setter 등이 들어가게 된다.
1 - 2) 다대일 양방향
회원 엔티티
@Entity
public class Member {
...
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
팀 엔티티
@Entity
public class Team {
...
@OneToMany(mappedBy = "team")
privat List<Member> members = new ArrayList<Member>();
public void addMember(member) {
this.members.add(member);
if (member.getTeam() != this {
member.setTeam(this);
}
}
...
}
- 양방향은 외래 키가 있는 쪽이 연관관계의 주인이다.
- 양방향 연관관계는 항상 서로를 참조해야 한다.
2. 일대다
2 - 1) 일대다 단방향
일대다 단방향 관계를 매핑할 때는 JoinColumn을 명시해야 한다. 그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블 전략을 기본으로 사용해서 매핑한다.
※ 일대다 단방향 매핑의 단점 : 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다는 점이다. 따라서 연관관계 처리를 위한 SQL문을 추가로 실행해야 한다.
2 - 2) 일대다 양방향
일대 다 양방향 매핑은 존재하지 않는다. 대신 다대일 양방향 매핑을 사용해야 한다. @OneToMany는 연관관계의 주인이 될 수 없다.
3. 일대일
대상 테이블 중 어느 곳이나 외래키를 가질 수 있다는 점이 특징이다. 대상 테이블 중 어느 쪽에 외래 키를 줄지를 선택하는 과정은 다음과 같다.
3 - 1) 주 테이블에 외래 키
객체지향 개발자들은 주 테이블에 외래키가 있는 것을 선호한다. JPA도 주 테이블에 외래키가 있으면 더 편리하게 매핑할 수 있다.
단방향 :
@Entity
public class Member {
...
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
...
}
양방향 :
@Entity
public class Member {
...
@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;
...
}
3 - 2) 대상 테이블에 외래 키
일대일 관계 중 대상 테이블에 외래 키가 있는 단방향 관계는 JPA에서 지원하지 않는다. 일대일 매핑에서 대상 테이블에 외래 키를 두고 싶으면 아래와 같이 양방향으로 매핑한다.
@Entity
public class Member {
...
@OneToOne(mappedBy = "member")
private Locker locker;
...
}
@Entity
public class Locker {
...
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
...
}
4. 다대다
관계형 데이터베이스에서는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없어서 다대다 관계를 일대다, 다대일 관계로 풀어낸다. 추천하는 기본 키 생성 전략은 데이터베이스에서 자동으로 생성해주는 대리 키를 Long 값으로 사용하는 것이다. 이렇게 하면 간편하고 거의 영구적이며 비즈니스에 의존하지 않게 된다. 아래 코드 예시를 보자.
@Entity
public class Order {
...
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
...
}'JAVA > 스프링 데이터 JPA' 카테고리의 다른 글
| 값 타입 (2) | 2024.05.16 |
|---|---|
| 프록시와 연관관계 매핑 (0) | 2024.05.06 |
| 연관관계 매핑 기초 (0) | 2024.04.11 |
| 엔티티 매핑 (2) | 2024.04.04 |
| 영속성 관리 (0) | 2024.03.27 |