팀과 회원은 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);