JPA inheritance bulk-id strategies JPA에서 Inheritance를 사용한 경우 batch delete 구현 방법을 다뤄봅니다. Links에 있는 Hibernate post를 보시면 좀더 상세한 글을 확인할 수 있습니다. 깃헙 원문으로 가시면 실제 소스코드도 확인하실 수 있습니다. 테스트 환경 H2 DB MySQL 5.7.24 class 상속 구성 Person 클래스를 상속하는 Doctor, Student가 있습니다. JOINED Inheritance를 사용하였습니다. @Entity(name = "person") @Inheritance(strategy = InheritanceType.JOINED) open class PersonEntity( @Id @GeneratedValue..
JPA(Hibernate) 검색 결과
JPA Repository를 이용한 레코드 삭제 레코드를 삭제하는 코드를 작성하다 보면 1:N의 관계에서 1의 id를 가지고 N의 레코드를 삭제할 때가 있습니다. JpaRepository에서 team과 teamMember의 관계를 예로 들어 아래처럼 코드를 짤 수 있습니다. fun deleteAllByTeamId(teamId: UUID) 물론 제대로 동작도 합니다. 다만 이 코드는 과도한 성능이 필요할 수 있는 위험을 내포하고 있습니다. 만약 해당 팀의 멤버가 10000명이라면 어떻게 될까요? 그러면 아래처럼 무수한 delete 쿼리가 DB 서버로 날아가게 됩니다. // pseudo code select teamMember by teamId delete teamMember1 delete teamMembe..
Kotlin의 모든 class는 기본적으로 final이기 때문에 JPA Lazy Proxy가 적용되지 않습니다. JPA Lazy Proxy를 이용하기 위해 kotlin-allopen compiler plugin 의존성을 추가해주고 JPA Entity에 allOpen 설정을 명시해줘야 합니다. gradle 예시 buildscript { // ... // dependencies { classpath group: 'org.jetbrains.kotlin', name: 'kotlin-allopen', version: "$kotlinVersion" } } allOpen { annotation "javax.persistence.Entity" }
JPA paging을 할 때는 COUNT()에 fetch될 항목까지 들어가면 위의 QueryException이 발생합니다. 잘못된 예 @Query(value = """ SELECT p FROM Post p INNER JOIN FETCH p.writerUser """ ) fun findWithWriterUser(pageable: Pageable): Page 올바로 동작하는 예 @Query( value = """ SELECT p FROM Post p INNER JOIN FETCH p.writerUser wu """, countQuery = """ SELECT COUNT(p) FROM Post p INNER JOIN p.writerUser wu """ ) fun findWithWriterUser(pageabl..