Spring boot + kotlin 에서 OneToMany relationship 에서 발생하는 문제

Sung Min Lee
3 min readJul 13, 2018

Spring boot 프로젝트를 kotlin 으로 만들고 있는데 인수 테스트가 잘 통과하다가 처음으로 OneToMany 필드를 작성했을 때 문제가 생겼다.

org.hibernate.AnnotationException — Collection has neither generic type or OneToMany.targetEntity()

예외는 description 에 나와있는 거 처럼 hibernate OneToMany 에 쓰이는 Collection 은 generic type 이면 안된다. hibernate 는 실행시점에 어떤 table(= class) 가 사용되는지 알수없기 때문에 concrete class 만 OneToMany field 에 사용할수 있다.

예를 들어

AdminUser extends User

NormalUser extends User

GuestUser extends User

이렇게 세 종류의 entity 가 있다고 하자. OO 에서 상속을 사용하는 이유는 공변성/반공변성을 이용해서 코드를 유연하게 작성하기 위해서라고 생각한다.

하지만 table 관점에서 보면 AdminUser / NormalUser / GuestUser 는 각각 다른 table 이다 (직관적으로 생각하면 <? extends User> 를 갖는 OneToMany field 가 존재하면 해당 필드에는 Admin, Normal, Guest 의 pk 가 중복되서 들어가서constraints violation).

문제는

작성하고 있는 코드에서는 Category table field 에 items: List<Item> 필드가 OneToMany 로 존재하고 있었다. Item 은 어떠한 객체도 상속받고 있지 않았기 때문에 설명이 되지 않았다. 그래서 조금 더 검색해봤는데 문제는 kotlin 에서 List interface 의 구현이 List<out E> 로 되어 있었던 부분이 문제였다.

결국 var items: List<Item>var items:List<out Item> (= List<? extends Item> items;) 으로 빌드 되었고 위와 같은 예외가 발생했다.

해결 방법

List 대신 MutableList 로 바꿔주면 해결된다. MutableList interface 는 MutableList<E> 로 되어있다.

참고 링크

--

--