📌요구사항
- 회원과 팀 엔티티가 있다.
- 회원은 하나의 팀에만 소속될 수 있고, 하나의 팀에는 여러명의 회원이 소속 될 수 있다.
- 회원과 팀은 다대일 관계다.
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name="USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColum(name="TEAM_ID")
private Team team;
}
@Entity
public class Team{
@Id @GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
}
@ManyToOne
:다대일
관계임을 알려줌.
- 하나의 팀에 여러멤버가 소속되므로 멤버가 N, 팀이 1이다.
@JoinColum
:조인해야하는 컬럼
을 알려줌.
- TEAM_ID 컬럼과 조인해야하므로 name="TEAM_ID" 작성
//팀 저장
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();
//팀 저장
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
//회원1에 새로운 팀B 설정
member.setTeam(teamB);
- 테이블의 연관관계에는 방향이란게 없다.
- FK 하나로 서로의 연관을 모두 알수 있기 때문.
- 하지만 객체 연관관계에서는 Member에서 Team으로 갈 수 있지만, Team에서 Member로 갈수 있는 방법이 없다.
➡️Team에서 Member로 갈 수 있도록 Team에 리스트를 넣어줘야한다.
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name="USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColum(name="TEAM_ID")
private Team team;
}
- Member 엔티티는 단방향 매핑때와 동일. 달라진게 없다.
@Entity
public class Team{
@Id @GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
@OneToMany
:일대다
관계임을 알려줌.
- Member에서 Team으로 가는게 다대일이면 Team에서 Member로 가는건 일대다
mappedBy
: 무엇과 조인이 걸려있는지(매핑되었는지 알려줌.)
- Member의
JoinColumn
되어 있는객체
를 적어주면 된다.
//team 조회
Team findTeam = em.find(Team.class, team.getId());
//역방향 조회
int memberSize = findTeam.getMembers().size();
객체와 테이블간에 연관관계 맺는 차이를 이해해야 mappedBy를 이해하기 쉽다.
➡️객체의 양방향 관계는 서로 다른 단방향 관계 2개다!
즉, 테이블은 외래키 하나로 두 테이블의 연관관계를 정리하지만 객체의 양방향 관계는 단방향관계 2개이므로 둘 중 한개의 연관관계로 외래키를 관리해야한다.
➡️여기서 결정한 한개의 연관관계가 바로연관관계의 주인
이 되는 것!
연관관계의 주인
으로 지정외래 키를 관리
(등록, 수정)읽기만
가능사용 불가
mappedBy
속성으로 주인 지정➡️외래키가 있는 곳을 주인으로 정해라
Member.team
이 연관관계의 주인이다@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@Column(name="USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColum(name="TEAM_ID")
private Team team;
...
//연관관계 편의 메서드 작성
public void changeTeam(Team team){
this.team = team;
team.getMember().add(this);
}
}
@Entity
public class Team{
@Id @GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
//team 저장
Team team = new team();
team.setName("teamA");
em.persist(team);
//MEMBER 저장
Member member = new Member();
member.setName("memberA");
//연관관계 편의 메서드를 사용해서 값 저장
member.changeTeam(team);
em.persist