팀과 회원은 1대다 매핑
객체를 테이블에 맞추어 모델링한 경우
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
@Column(name = "TEAM_ID")
private Long teamId;
}
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
//팀과 멤버를 저장하는 경우
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeamId(team.getId());
em.persist(member);
//조회할 때
Member findMember = em.find(Member.class, member.getId());
Team findTeam = em.find(Team.class, team.getId());
- 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식
- 테이블의 외래키를 객체에 그대로 가져오기 때문에 객체 그래프 탐색이 불가능하다.
- 외래 키 식별자를 직접 다뤄야 한다.
- 객체지향적으로 코딩할 수 없다.
- 객체와 테이블 간의 연관관계 매핑이 필요!
단방향 연관관계 모델링
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
//객체지향 모델링을 위해 Team의 외래 키를 포함시키는 대신에
//아래와 같이 연관관계 매핑한다. (ORM 매핑)
// @Column(name = "TEAM_ID")
// private Long teamId;
//Member와 Team는 다 대 1 관계
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
//객체지향 모델링 후 연관관계 저장하기
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장!
em.persist(member);
//참조로 연관관계 조회하기 - 객체 그래프 탐색
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam(); //참조를 통해 연관관계 조회
System.out.println("findTeam = " + findTeam.getName());
Team teamB = new Team();
teamB.setName("teamB");
em.persist(teamB);
//수정
findMember.setTeam(teamB);