Unable to build Hibernate SessionFactory; nested exception is org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 오류 해결법

728x90

https://eclipse4j.tistory.com/215

 

하나의 Entity에서 다중 Eager의 사용.

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 특정 버전 이상에서 해당 규격에 대한 검증을 시작한 듯 하다. 가령 Vendor라는 Entity가 있는데, oneto..

eclipse4j.tistory.com

윗 글을 참조했다. MultipleBagFetchException 이 발생했는데,  간략하게 말하자면 Eager fetch타입을 2개이상 써서 발생한 문제이다. 지금 만들고 있는 프로젝트에서 가장 많은 매핑이 되어있는 Feed 엔티티의 테스트를 해보니 정상적으로 진행된다. 


신나게 fetch = FetchType.LAZY 로 도배를 하고 있었다... 하지만 아래와 같은 오류가 발생했다. 
(실은 FetchType.Eager로 도배가 되있었던건 이 오류가 발생했었기 때문이다..) 

 

두번째 오류 : org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

https://ankonichijyou.tistory.com/entry/JPA-OneToMany-%EC%98%A4%EB%A5%98

 

[JPA] OneToMany 오류

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.sample.vo.Team.members, could not initialize proxy - no Session 일대다 맵핑 테스트 코드를 실행하는데..

ankonichijyou.tistory.com

위의 글을 참고했다. 귀신같이 한방에 해결했다. 단지 테스트 메서드에 @Transactional 어노테이션을 추가해서 트랜잭션처리 하니까 실패했던 테스트들이 모두 파란불이 떳다!!

트랜잭션 처리는 service 단에서만 사용하면 될 줄알았는데... test단에서도 사용해야할지는 상상도 못했다.
간략하게 설명하자면... 트랜잭션 처리가 안되어있으면, find하거나 save함으로써 얻은 영속성이 유지되지 않고 다른 다른 영속성을 얻거나 잃는 작업을 할 때, 기존의 것을 모두 clear(EntityManager의 함수중에 clear였나 delete 였던가..? 하여튼 현재 얻은 모든 영속성을 제거하는 함수를 의미한다) 해버리는 것 같다. 따라서 영속성을 잃었기 때문에, 지금 테스트처럼 Feed 엔티티에서 양방향 맵핑되어있는 Chat엔티티나 Likefull, Share 엔티티를 찾지 못하는 거였다.

728x90