본문 바로가기

CS 잡지식

연관 관계 세팅 TIP!!!

@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)); // [양방향] 연관 관계를 생성자 하나로 세팅
}