하이버네이트에서 Bag이란?
자바 컬렉션 프레임워크에는 Bag이 없어, List를 Bag으로 사용하고 있다.
- @OrderColumn 은 잘 사용하지 않는데 다음과 같은 이유가 있다.
- Column이 엔티티에서 직접 관리 되므로, 관련 엔티티를 가져오려는 경우 Update 쿼리가 날아간다.
- 요소가 하나만 바뀌어도, 모든 위치 값이 변경된다. 순서 값을 보장하기 위함
- 중간에 관련 컬럼값이 없으면 null 이 저장이 된다. 012 순서에서 023로 바꾸는 경우, 1의 위치에 null 값이 들어간 컬렉션이 반환된다.
@OneToMany 관계인 엔티티에서 Bag으로 된(다시 한번 말하지만 List와는 순서와 있고 없고에서 확실하게 구분이 된다.) 엔티티를 2개 이상 가져오려고 하는 경우, 해당 에러가 발생한다.
가장 이상적인 방법은, 두 엔티티를 분리해서 가져오는 것이다.
쿼리 힌트로 QueryHints.HINT_PASS_DISTINCT_THROUGH 을 false 로 사용하면 실제 생성되는 SQL 쿼리에 DISTINCT 키워드가 포함되는 것을 방지할 수 있다.
Query query = entityManager.createQuery(jpql)
.setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false);
https://www.baeldung.com/java-hibernate-multiplebagfetchexception
https://vladmihalcea.com/hibernate-multiplebagfetchexception/