JPA Entity에서 Set 사용 시 equals, hashCode 구현과 해시 충돌 해결기
·
JPA
서론Hibernate 6로 업그레이드하면서 기존에 잘 동작하던 코드에서 성능 문제가 발생했다. 문제의 원인은 JPA Entity에서 Set 컬렉션을 사용할 때 equals와 hashCode를 제대로 구현하지 않아서 생긴 해시 충돌이었다. 특히 클래스 기반 hashCode 구현으로 인해 모든 같은 타입의 Entity가 동일한 해시값을 가지면서 HashSet이 O(n) 성능으로 동작하는 치명적인 문제를 겪었다. 오늘은 이 문제의 원인과 해결 과정을 정리해보자.본론문제 상황: 클래스 기반 hashCode의 함정처음에는 JPA Buddy가 생성해주는 equals, hashCode를 그대로 사용했다. JPA Buddy를 선택한 이유는 다음과 같았다:JPA Buddy를 사용한 이유:- Hibernate 프록시 문제..
[JPA] No EntityManager with actual transaction available for current thread - cannot reliably process 'flush' call
·
JPA
에러가 발생한 이유EntityManager 는 트랜잭션 안에서만 동작한다.EntityManager 가 메서드 내에서 동작할 때 현재 트랜잭션이 없기 때문에 발생한다.해결하려면 트랜잭션 내에서 실행되도록 보장해야 한다.해결법실행하려는 메서드(또는 클래스)에 @Transactional 애너테이션을 붙인다.코드 예시@Transactional // 트랜잭션 내에서 동작하도록 보장@Testvoid example() { // ...} 읽어주셔서 감사합니다.
[JPA] cascade = CascadeType.REMOVE, orphanRemoval = true 두 옵션을 명시적으로 사용하는 이유
·
JPA
JPA에서 @OneToMany같은 연관관계 매핑에 사용하는 애너테이션을 사용할 때 cacade 옵션과 orphanRemoval 옵션을 볼 수 있다.이 옵션에 대해서는 간단하게 요약하면 아래와 같다.CascadeType 그리고 orphanRemovalcascade = CascadeType.REMOVE이 옵션은 부모 엔티티의 라이프 사이클 변경이 자식 엔티티로 전파되도록 지정하는 옵션이다.부모 엔티티가 삭제될 때 자식 엔티티들도 같이 삭제된다.orphanRemove = true이 옵션은 부모 엔티티의 컬렉션에서 제거된 자식 엔티티들을 자동으로 삭제하도록 지정하는 옵션이다.만약 부모 엔티티의 컬렉션에서 자식 엔티티가 제거되면, 영속성 컨텍스트에서도 해당 자식 엔티티에 대해 삭제 작업이 즉시 수행된다.두 옵션에..