[JPA] Self Reference (순환 참조, 셀프 참조)

hyyyynjn·2021년 3월 26일
2
post-thumbnail
  • 자기 자신을 참조하는 경우를 순환 참조라고 한다.

JPA에서 순환 참조 관계 맺기

@Entity
@Getter
@Setter
public class CommonCode {
	
    @Column(name = "CODE_ID")
    private String codeId;
    
    @Column(name = "CODE_NAME")
    private String codeName;
}
  • CommonCode 엔티티는
    • 하나의 CommonCode를 부모로 가지고
    • List<CommonCode>를 자식으로 가져야한다.
  • 그러기 위해선 CommonCode 엔티티에 @ManyToOne@OneToMany를 정의해야한다.
    • @ManyToOne : 부모 클래스를 정의할 때 사용한다.
    • @OneToMany : 자식 클래스를 정의할 때 사용한다.

@ManyToOne : 부모 클래스를 정의

@Entity
@Getter
@Setter
public class CommonCode {
	
    @Column(name = "CODE_ID")
    private String codeId;
    
    @Column(name = "CODE_NAME")
    private String codeName;
    
    // 부모 정의
    @ManyToOne(fetch = "FetchType.LAZY)
    @JoinColumn(name = "PAR_CODE_ID")
    private CommonCode parent;
}
  • 상호 테이블간의 관계(join)을 정의해준다.

@OneToMany : 자식 클래스를 정의

@Entity
@Getter
@Setter
public class CommonCode {
	
    @Column(name = "CODE_ID")
    private String codeId;
    
    @Column(name = "CODE_NAME")
    private String codeName;
    
    // 부모 정의
    @ManyToOne(fetch = "FetchType.LAZY")
    @JoinColumn(name = "PAR_CODE_ID")
    private CommonCode parent;
    
    // 자식 정의
    @OneToMany(fetch = "FetchType.LAZY", mappedBy = "parent")
    private List<CommonCode> children;
}
  • 부모가 어떤 이름으로 mapping되어 있는지에 대한 property만 설정해준다.
    • 부모의 변수명을 parent라고 설정했으므로 자식의 mappedBy 값에 parent를 설정한다.

적용하기

@Getter
@NoArgsConstructor
@Entity
public class User extends BaseTimeEntity {
	
    ...
    
    // 부모 정의 (셀프 참조)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SUPER_USER_ID")
    private User superUser;

    // 자식 정의
    @OneToMany(fetch = FetchType.LAZY,mappedBy = "superUser", cascade = CascadeType.ALL)
    private List<User> subUsers;
	
    ...

}

0개의 댓글