// @ManyToOne 부분 객체명과 매핑
@OneToMany(mappedBy = "team")
private List<Member> member = new ArrayList<Member>();
- 멤버에서 팀으로 접근 -> 팀에서도 멤버를 접근
// 양방향 매핑
Member findSideMember = em.find(Member.class, member.getId());
// 멤버에서
List<Member> members = findSideMember.getTeam().getMember();
for(Member m : members) {
System.out.println("result = " + m.getName());
}
Team team = new Team();
team.setName("TeamD");
em.persist(team);
Member member = new Member();
member.setName("member4");
member.setTeam(team);
em.persist(member);
// 수정
//1L =1번에 시퀀스를 가진 값
Team newTeam = em.find(Team.class, 1L);
findMember.setTeam(newTeam);
System.out.println("findTeamName : " + newTeam.getName());
System.out.println("findTeam.getid() : " + newTeam.getId() );
Team
으로 가는 team 참조 값과, Team에서 Member
로 가는Member
에서 Team
값이 수정 되었을 때 Member table의 TEAM_ID
가 수정되야 하는지,Team
에 있는 members
를 수정했을 때 Member table의 TEAM_ID
가 수정되야 하는지?TEAM_ID
만 update되면 된다 -> 룰(주인)이 생긴다.mappedBy
속성 사용XmappedBy
: 내가 누군가에 의해서 mapping되었다 라는 뜻mappedBy
속성으로 주인 지정 @ManyToOne
: 여기에선 Team이 하나@JoinColumn(name = "TEMA_ID")
: 관계 컬럼을 적어준다. Team_ID와 조인해야 한다. @ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
team
에 의해서 관리가 된다.mappedBy
가 적힌 곳은 읽기만 가능하다. @OneToMany(mappedBy = "team")
- 여기서는 Member.team이 연관관계의 주인
- 결론: 외래키가 있는곳을 주인(Owner)로 결정하라.
Member member = new Member();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMember().add(member);
em.persist(team);
em.flush();
em.clear();
- Team이 없는 Member가 들어가있다.
- 연관관계 주인은 Member다.
- 그래서 팀을 통해 멤버의 값을 add 업데이트 해주는 것은 불가
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
System.out.println("===========================");
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMember();
for( Member m : members) {
System.out.println("m = " + m.getName());
}
System.out.println("===========================");
- select Team
- select Member
- team안에 member를 넣어준다.
- 결과값이 출력된다.
team.getMembers().add(member); , member.setTeam(team);
em.flush(); em.clear()없다면 출력되지 않는다.
Team에는 Member값이 없다. -> Member에는 Team값이 있다
-> 이 상태에서 team을 기준으로 Member 획득하려고함 -> Db를 들리지 않고 영속성 컨텍스트에 값을 가져온다 -> Team.class를 기점으로해서 획득해온 결과값에는 Member객체 값이 담겨있지 않다. -> 그 상태로 findTeam.getMember(); 하면
-> 출력해 줄 것이 없다
// Team에는 Member값이 없다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// Member에는 Team값이 있다
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member);
// 객체 지향적인 입장에서 양쪽에 모두 값을 넣어주어야 한다.
// 양방향 매핑시에는 양쪽에 값을 모두 입력해 주어야 한다.
// DB를 다시 다녀오지 않고 객체 상태로만 사용 할 수 있다.
team.getMember().add(member);
System.out.println("===========================");
//Team.class 획득해온 결과값에는 Member객체 값이 담겨있지 않다.
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMember();
// 출력해 줄 것이 없어
for( Member m : members) {
System.out.println("m = " + m.getName());
}
System.out.println("===========================");
Member
, Team
에서 적용 Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
// member.setTeam(team);
member.changeTeam(team); // Member에 적용
em.persist(member);
team.addMember(member); // Team에 적용
// team.getMember().add(member);
@ManyToOne
@JoinColumn(name = "TEAM_ID")
@Setter(value = AccessLevel.NONE)
private Team team;
public void setTeam(Team team) {
this.team = team;
}
====>>> changeTeam으로 바꿔준다.
// 일반적으로 setter의 형태가 아니면 메서드 이름을 바꿔준다.
// 추후 소스코드를 봤을때 단순 setter의 작업이 아닌 중요한 작업을 진행하는지를 파악 할 수 있다.
public void changeTeam(Team team) {
this.team = team;
// this : 나 자신의 인스턴스를 넣어준다.
team.getMember().add(this);
}
public void addMember(Member member) {
member.setTeam(this);
this.member.add(member);
}