SelfJoin Relation in JPA

jason Moon
3 min readAug 14, 2018

--

JPA에서 순환 참조 관계 맺기.

아래와 같은 “공통코드” 테이블이 존재한다.

코드ID가 Primary Key이고, 부모코드ID를 참조하며 순환 참조된다.

즉, 아래와 같은 데이터 구조가 가능하다.

JPA에서 이 관계를 설정하려면 어떻게 해야할까?

먼저 간단한 CommonCode Entity를 만들어보자.

이제 CommonCode Class는 하나의 CommonCode를 부모로 가지고, List<CommonCode>를 자식으로 가져야한다.

CommonCode Entity에 ManyToOne(1)과 OneToMany(2)를 정의해야하는데,

(1)에서는 Many가 전자, One이 후자라고 하겠다.

(2)에서는 One이 전자, Many가 후자라고 하자.

그럼 전자는 해당 클래스가 되고, 후자는 내가 아래에 정의할 클래스가 된다.

지금 설정은 자체 순환참조이기 때문에, 전후자가 모두 CommonCode Entity가 된다.

ManyToOne은 부모 클래스를 정의할때 사용하고, OneToMany는 자식 클래스를 정의할때 사용한다고 생각하면 쉽다.

부모 Entity를 정의해보자. ManyToOne을 사용한다.

JoinColumn Annotation은 SQL “ON” 절이라고 볼 수 있다.

OneToMany의 FetchType은 상황에 따라 적절히 사용하기로 한다.

보통은 FetchType.LAZY를 사용한다.

이번에는 자식 Entity를 정의해보자. OneToMany를 사용한다.

이번에는 부모 Entity를 정의할때보다 많이 간단하다.

이미, 상호 테이블에 대한 관계(Join)이 부모 Entity를 정의할때 설정되었기 때문에, 해당 부모 Entity가 어떤 이름으로 Mapping 되었는지에 대한 property만 설정해주면 된다.

위에서 부모 Entity의 변수명을 parent로 해줬기 때문에 mappedBy 값에 “parent”를 설정했다.

이렇게 되면 설정이 끝난다.

SpringDataJpa를 활용한다면, JpaRepository에서 findOne 메서드를 통해 순환 참조된 데이터를 간단하게 얻어 낼 수 있게 된다.

--

--