@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter@Setter
@ToString(of={"id","username","age"}) // 여기에다가 "team"을 넣으면, 무한루프 일어남!!!(모르겠으면, 게시물 참조)
public class Member { // 연관 관계 필드들은 안 넣어야 한다.
@Id@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
public Member(String username){
this.username=username;
this.age =0;
this.team = null;
}
public Member(String username,int age){
this.username=username;
this.age = age;
this.team = null;
}
public Member(String username,int age, Team team){
this.username=username;
this.age = age;
if(team != null){
changeTeam(team);
}
}
// 양뱡향 관계 편의 메서드
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
@Entity
@Getter@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of={"id","name"})
public class Team {
@Id@GeneratedValue
@Column(name ="team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public Team(String name){
this.name = name;
}
}
보통의 경우, setter를 통해서 [양방향] 연관 관계 세팅을 한다.
Team teamA = new Team("teamA");
em.persist(teamA);
Memberm member = new Member("member1");
em.persist(member);
//setter를 통해서 [양방향] 연관 관계 세팅
member.setTeam(teamA);
teamA.getMembers().add(member);
그러나, Member의 생성자에 team 객체를 넣어서 하면 훨씬 깔끔하다.
// 양뱡향 관계 편의 메서드
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
public Member(String username){
this.username=username;
this.age =0;
this.team = null;
}
public Member(String username,int age){
this.username=username;
this.age = age;
this.team = null;
}
public Member(String username,int age, Team team){
this.username=username;
this.age = age;
if(team != null){
changeTeam(team);
}
위 코드와 같이 생성자와 편의 메서드를 이용하면 [양방향] 연관 관계를 아래와 같이 깔금하게 세팅가능하다.
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
for(int i = 0;i< 100;i++){
Team selectedTeam = (i % 2) == 0 ? teamA:teamB;
em.persist(new Member("member"+i,i,selectedTeam)); // [양방향] 연관 관계를 생성자 하나로 세팅
}
'CS 잡지식' 카테고리의 다른 글
[사용자 정의 인터페이스] with Spring Data JPA (0) | 2023.05.19 |
---|---|
동적(dynamic) 쿼리 vs 정적(static) 쿼리 (0) | 2023.05.19 |
샘플 데이터 입력의 2가지 방법 (0) | 2023.05.19 |
Querydsl 사용 시, 주의해야 할 버그(newInstance, ExpressException..) (0) | 2023.05.19 |
use_sql_comments: true (0) | 2023.05.17 |