문제 상황
- 서버에 배포된 낙찰 api 에서 가장 높은 가격으로 입찰한 입찰자에게 상품이 낙찰되는것이 아니라 가장 먼저 입찰한 입찰자에게 상품이 낙찰되는 문제가 발생했습니다.
- Product도메인의 selectWinner() 메서드에서는 해당 상품의 모든 입찰 정보를 biddings 리스트로 가져와서 리스트의 첫번째 값을 기반으로 낙찰자를 선정합니다.
- 여기서 문제점은 상품의 낙찰 리스트를 “높은 가격순으로 정렬" 하지 않기 때문에
- 최고 가격을 제시한 입찰자가 낙찰되지 못하는 문제가 발생합니다.
- 조회해온 리스트 정렬
- DB에서 조회해온 컬렉션은 불변 리스트라 정렬 불가능 - (제프 의견)
- 그래서 제프가 biddings 리스트를 가격순으로 정렬해서 리스트의 첫번째 값을 가져오는식으로 해결했습니다.
- 그런데 여기서 또 문제가 되는점이 하이버네이트에서 컬렉션 타입은 영속화 될 때org.hibernate.collection.internal.PersistentBag 타입으로 래핑됩니다.
- 참고:
- 그래서 다음과 같은 에러가 발생합니다.
- Product.biddings 에 @OrderBy 어노테이션을 붙여서 해결했습니다.
- 발생하는 쿼리 확인
- 참고:

시도했던 방법1
시도했던 방법2


하이버네이트는 PersistentBag을 이용하여 영속적 전이(cascade)와 고아 객체(orphanremoval) 를 추적하는데, 임의로 새로운 ArrayList를 생성하여 참조를 변경하니 PersistentBag 인스턴스가 엔티티와의 참조가 끊어져 버려 문제가 발생하게 된 것입니다.