연관관계 매핑 기초공부방/JPA2023. 2. 19. 23:08
Table of Contents
객체를 테이블에 맞추어 데이터 중심으로 모델링 하면, 협력 관계를 만들 수 없다.
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이런 큰 간격이 있다.
단방향 연관관계
객체 지향 모델링
(객체 연관관계 사용)
객체 지향 모델링
(객체의 참조와 테이블의 외래 키를 매핑 )
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@Column(name = "TEAM_ID")
private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
객체 지향 모델링
(ORM 매핑)
객체 지향 모델링
(연관관계 저장)
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
객체 지향 모델링
(참조로 연관관계 조회 - 객체 그래프 탐색)
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
객체 지향 모델링
(연관관계 수정)
// 새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
// 회원1에 새로운 팀B 설정
member.setTeam(teamB);
양방향 연관관계와 연관관계의 주인
양방향 매핑
양방향 매핑
(Member 엔티티는 단방향과 동일)
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
......
양방향 매핑
(Team 엔티티는 컬렉션 추가)
@Entity
public class Team {
private String name;
}
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
...
양방향 매핑
(반대 방향으로 객체 그래프 탐색)
//조회
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //역방향 조회
연관관계의 주인과 mappedBy
둘중 주인은?
- 외래 키가 있는 곳을 주인으로 정해야함
- 여기서는 Member.team 이 연관관계의 주인
양방향 매핑시 가장 많이 하는 실수
(연관관계의 주인에 값을 입력하지 않음)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
양방향 매핑시 연관관계의 주인에 값을 입력 해야 한다.
(순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력 해야 한다.)
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //중요
team.getMembers().add(member); //연관관계의 주인에 값 설정 (읽기 전용 값이라 실제로 쿼리가 날라가지 않음)
em.persist(member);
반응형
@soycrab :: 꿀맛코딩
행복한 코딩을 위하여!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!