- 자기 자신을 참조하는 경우를
순환 참조
라고 한다.
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;
...
}