jpa-data에서 테이블을 oracle의 start with 처럼 재귀적으로 호출 하기 위해 self join 하는 경우 아래와 같이 정의 해주면 됩니다.

T_CONTS_TEMPLATE 테이블의 컬럼 중

CONTS_TEMP_SEQ<--기본키
CONTS_PARENT_SEQ<--부모키
이 존재 하는 경우 parent와 children을 아래와 같이 정의 합니다.

//@Where(clause = "useYn='N'")
@JsonIgnore
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumn(name = "CONTS_PARENT_SEQ", insertable=false, updatable=false)
private ContentsTemplate parent;

//@Where(clause = "useYn='N'")
@JsonProperty("nodes")
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTS_PARENT_SEQ")
@OrderBy("contsTempSeq asc")
private List<ContentsTemplate> children = new ArrayList<ContentsTemplate>();


@JsonIgnore 은 부모 객체를 json으로 변경 하면서 children을 재 참조 하는 상황을 방지 하기 위해서 json 생성시 예외 처리 합니다.
@JsonProperty("nodes") 은 Bootstrap Tree View 에서 데이터를 받을때 nodes라는 이름으로 받기 때문에 추가 해줬습니다.
FetchType.LAZY은 가능하면 lazy로 해주는게 좋습니다. EAGER(즉시호출) 하는 경우 예상하지 못한 쿼리문이
출력 되는경우가 생겨서 언제나 쿼리문 검증을 해야 하는 부담감이 있습니다.

반응형
Posted by 질주하는구
,