[JPA] 단방향 연관관계
✔ 연관관계 매핑 기초
객체가 지향하는 패러다임과 RDB가 지향하는 패러다임의 차이를 이해한다.
- 객체와 테이블 연관관계의 차이를 이해한다.
- 객체의 참조와 테이블의 외래 키를 어떻게 매핑하는가?
- 방향(Direction)
- 단방향, 양방향
- 다중성(Multiplicity)
- 일대다(1:N), 다대일(N:1), 일대일(1:1), 다대다(N:M)
- 연관관계의 주인
- 객체 양방향 연관관계는 관리가 필요
✔ 연관관계가 필요한 이유
- 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다
✔ 예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속 될 수 있다.
- 회원과 팀은 다대일 관계다.
- 하나의 팀에 여러회원이 소속 된다.
✔ 객체를 테이블에 맞추어 모델링
✅ 연관관계가 없는 객체 (RDBMS 관점)
✅ 객체를 테이블에 맞추어 모델링 하는 경우의 문제점
- 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용하여 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이러한 큰 간격 존재한다.
- 테이블 == 외래키 조인
- 객체 == 참조
✅ 단방향 연관관계
- Member 테이블을 기준으로 Team은 1:N 인 상황
- 회원은 여러명 = 팀은 한개
- @ManyToOne
- FK를 지정해주면 된다
JPA Main
try {
//저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
MemberTest member = new MemberTest();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
//조회
MemberTest member1 = em.find(MemberTest.class, member.getId());
Team findTeam = member1.getTeam();
System.out.println("findTeam : " + findTeam.getName());
} catch (Exception e) {
} finally {
em.close();
}
연관 관계 매핑 전
Team team = new Team();
team.setName("TeamA") //팀명 셋팅
em.persist(team);
MemberTest member = new MemberTest();
member.setUsername("member1");
member.setTeam(team.getTeamId()); //변경 전
연관 관계 매핑 후
Team team = new Team();
team.setName("TeamA") //팀명 셋팅
em.persist(team);
MemberTest member = new MemberTest();
member.setUsername("member1");
member.setTeam(team); //변경 후
- JPA는 기본적으로 영속성 컨텍스트의 특성을 가짐
- 외래키(FK)를 넣어주는 것이 아닌 참조 변수(team)를 넣어준다
- @ManyToOne, @JoinColumn(name = “TEAM_ID”)로 매핑을 해둔 상황
- Member, Team 테이블에 자동으로 PK(기본키 값), FK(외래키 값)가 셋팅 된다
댓글남기기