목차
연관관계 매핑
객체와 테이블 연관관계 차이를 이해
객체의 참조와 테이블의 외래 키 매핑
용어 이해
- 방향(Direction) : 단방향, 양방향
- 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해
- 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리가 필요(가장 까다로움)
연관관계가 필요한 이유
객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계이다. (회원은 여러명이고, 팀은 1개이다.)
객체를 테이블에 맞추어 모델링
(연관관계가 없는 객체)
Member는 N이며 TEAM은 1이다.
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
//연관관계 매핑
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
//연관관계 설정
public void setTeam(Team team) {
this.team = team;
}
//Getter, Setter ...
}
@Entity
public class Team {
@Id
@Column (name = "TEAM_ID")
private String id;
private String name;
//Getter, Setter ...
}
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//Member
Member member = new Member();
member.setUsername("member1");
member.setTeamId(team.getId()); //여기서 이상함
em.persist(member);
//문제가 많은 find하기
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
위의 코드에서 문제점은 findMember를 memberId로 조회하고 그 조회한 내용 중에 TeamId를 가져와서 Team을 또 조회한다.
Join으로 협력관계가 있는게 아닌 Select를 두 번 하는 꼴
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
객체 지향 모델링
위의 모델링과 다른 점은 TeamId가 아닌 Team을 모델링 했다는 점이다.
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
//연관관계 매핑
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team; //가장 중요
//연관관계 설정
public void setTeam(Team team) {
this.team = team;
}
//Getter, Setter ...
}
@ManyToOne
Member 입장 에서 N이고 Team이 1이기 때문에 ManyToOne이다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//Member
Member member = new Member();
member.setUsername("member1");
//member.setTeamId(team.getId()); //여기서 이상함
member.setTeam(team);
em.persist(member);
//문제가 많은 find하기
Member findMember = em.find(Member.class, member.getId());
//Long findTeamId = findMember.getTeamId();
//Team findTeam = em.find(Team.class, findTeamId);
Team findTeam = findMember.getTeam();
위의 findMember는 select 문이 join문으로 알아서 해준다.
'Back-end > JPA' 카테고리의 다른 글
도메인 분석 설계 (N:N 뿌시기) (0) | 2022.11.19 |
---|---|
객체지향 쿼리 언어1 - 기본 문법 (0) | 2022.09.24 |
엔티티 매핑 (0) | 2022.08.06 |
[JPA] JPA 영속성 컨텍스트 (0) | 2022.05.05 |
[JPA] Batch Insert (0) | 2022.05.05 |