JPA 연관 관계 - 양방향 연관관계

목차

객체와 테이블이 관계를 맺는 차이

객체의 양방향 관계는 사실 양방향 관계가 아니라 서로다른 단방향 관계 2개 다.
테이블은 외래키 하나 로 두 테이블의 연관관계를 관리한다.

  • 객체 : 연관관계 2개 (단방향 2개)
    • 회원 —> 팀 연관관계 1개 (단방향)
    • 팀 —> 회원 연관관계 1개 (단방향)
  • 테이블 : 연관관계 1개 (양방향 1개)
    • 회원 <—> 팀의 연관관계 1개 (양방향)

양방향 연관관계로 설계하기

1:N 연관관계 Mapping

  • OneToMany 어노테이션을 이용해 1:N 연관관계를 Mapping 한다.
  • mappedBy 속성을 이용해 연관된 Entity 클래스 내 field 이름을 넣어준다.
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "TEAM_ID")
private Long id;
private String name;

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}

N:1 연관관계 Mapping

  • ManyToOne 어노테이션과 JoinColumn 어노테이션을 이용해 N:1 연관관계를 Mapping 한다.
@Entity
public class Member {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private long id;

@Column(name = "USERNAME")
private String username;

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}

JoinColumn 어노테이션을 이용한 외래키 관계 명시하기

Forign Key(외래 키) 생성시 JoinColumn 을 이용해 연관관계를 명시할 경우
Forign Key(외래 키) 기본 값은 필드명 + _ + 참조하는 테이블의 컬럼명 으로 생성된다.

@Entity
public class Member {

@Id
private long id;

private String username;

@ManyToOne
@JoinColumn
private Team team; // Team 객체를 Member 객체 내 Field 값으로 관리
}

외래키 생성시 JoinColumnname 속성 을 이용할 경우
외래키는 name 속성에 명시된 값으로 생성되는 것을 확인할 수 있다.

@Entity
public class Member {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private long id;

@Column(name = "USERNAME")
private String username;

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}

Mapping된 데이터 가져오기

Team team = new Team();
team.setName("TeamA");
entityManager.persist(team);

Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
entityManager.persist(member);

entityManager.flush();
entityManager.clear();

Member findMember = entityManager.find(Member.class, member.getId()); // Member가 속한 Team 정보를 가져온다.
List<Member> members = findMember.getTeam().getMembers(); // Team에 속한 Member 정보를 가져온다.

for (Member m : members) {
System.out.println("m = " + m.getUsername());
}
Share