Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
// 역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
team.getMembers().add(member);
// 연관관계의 주인에 값 설정
member.setTeam(team);
em.persist(member);
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team);
em.persist(member);
em.clear();
Member findMember = em.find(Member.class, member.getId());
그리고 세번째코드보다 더 좋은 방법이 있는데 연관관계 편의 메소드를 만드는 것이다.
[Member]
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team
// 연관관계 편의 메소드
public Team setTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
위의 코드처럼 연관관계 편의 메소드를 만들어 놓으면
member.setTeam(team);을 할 때 team의 members에도 값을 넣어주니
굳이 team.getMembers().add(member);의 코드를 작성할 필요가 없어진다.
예시 : toString(), lombok, JSON 생성 라이브러리
[Member]
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name="USERNAME")
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@Override
public String toString() {
return "Member{" +
"id=" + id +
", username='" + username + '\'' +
", team=" + team +
'}';
}
}
[Team]
@Entity
public class Team {
@Id @GeneratedValue
@Column(name="TEAM_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
@Override
public String toString() {
return "Team{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
}
이런 경우 Team이든 Member든 toString()을 호출하면 무한루프가 생긴다.
1. member의 toString() 호출
2. member의 toString()에서 team의 toString() 호출
3. team의 toString()에서 members를 호출 -> members는 member의 toString()을 호출
4. 이렇게 무한 반복