JPA 연관관계 매핑의 편의성
- DB에 실제로 저장되는 값은 외래 키밖에 없다
- 연관관계 매핑을 사용하여 Entity를 컴포지션하는 경우와, 연관관계 매핑을 사용하지 않고 외래 키를 선언하는 경우의 차이점에 대해 알아본다
JPA 연관관계 매핑을 사용하는 경우
Entity
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members;
}
조회
Member member = entityManager.find(Member.class, 1L);
Team team = member.getTeam();
List<Member> members = team.getMembers();
@ManyToOne
, @OneToMany
등의 연관관계 매핑을 사용하는 경우
- Member에서 Team을, Team에서 Member 리스트를 바로 가져올 수 있다
JPA 연관관계 매핑을 사용하지 않고 외래 키를 선언하는 경우
Entity
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(name = "team_id")
private Long teamId;
}
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
조회
Member member = entityManager.find(Member.class, 1L);
Team team = entityManager.find(Team.class, member.getTeamId());
List<Member> members = entityManager.createQuery("SELECT m FROM Member m WHERE m.teamId = :teamId, Member.class)
.setParameter("teamId", team.getId())
.getResultList();
member.getTeam()
대신 entityManager.find()
같은 메소드로 연관된 Entity를 일일히 가져와야 한다
- 쿼리할 때마다 일일히 JPQL로 JOIN 쿼리 작성 필요 → 생산성 저하
- 이 외에도 entityManager.persist() 순서처럼 신경써야 할 것들이 있다