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 검색 결과
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..
junit test 돌릴 때 hibernate query가 어떻게 동작하는지 보고 싶을 때 query가 안나오는 경우 1. query를 노출시키지 않은 경우 application.yml or .properties 파일에 아래처럼 설정을 추가해서 해결합니다. logging: level: org.hibernate.type: trace 2. 그래도 노출이 되지 않는다면 테스트케이스에서 트랜잭션이 롤백되면서 노출되지 않는 경우가 있는데요. 해당 테스트메서드나 클래스 상단에 아래처럼 어노테이션을 추가해주시면 트랜잭션이 커밋되면서 노출되게 됩니다. @Rollback(false) 하지만 트랜잭션 롤백이 되지 않아 다른 테스트에 영향을 줄 수 있게 되니 쿼리 확인할 때만 쓰시고 테스트 코드에 남기지는 마시기 바랍니다.