반응형 개발/JPA5 [JPA] Specification을 이용하여 쿼리 조건 처리하기 - 외래키 Specification Repository에 JpaSpecificationExecutor 인터페이스를 상속받으면 Specification을 사용할 수 있다. @Repository public interface GrandChildRepository extends JpaRepository, JpaSpecificationExecutor { } ※참고 : 복합키이기 때문에 JpaRepository를 상속받을 때 ID부분에 Id class를 넣어주면 된다. 관련 내용은 아래 포스팅을 참고하자 [JPA] 복합키, 외래키 Entity 설정하기(@IdClass를 사용하여 식별관계 매핑) 올해 초 복합키, 외래키 사용이 많은 테이블을 JPA Entity로 구현했어야 했는데, JPA 사용이 처음이였어서 익숙하지 않아 복.. 2022. 1. 7. [JPA] 복합키, 외래키 Entity 설정하기(@IdClass를 사용하여 식별관계 매핑) 올해 초 복합키, 외래키 사용이 많은 테이블을 JPA Entity로 구현했어야 했는데, JPA 사용이 처음이였어서 익숙하지 않아 복잡하게 느껴졌었다. 나같은 사람을 위해 정리해 본다! Entity에 복합키를 통한 식별관계를 매핑하는 방법은 @IdClass, @EmbededId 두가지가 있는데 본인은 @IdClass를 사용했다. @EmbededId는 @IdClass 방식 보다 좀더 객체지향 방식이라고 한다. 하지만 특정 객체를 사용하기 위해서 객체 그래프를 깊게 탐색해야하는 경우가 있고, 깊이 감춰져 있어서 명시적으로 보이지 않는다고.. 예를 들어 grandChild Entity에서 parent_id를 구하기 위해선 아래와 같이 탐색해야 한다. grandChild.getGId().getCId().getPI.. 2021. 12. 23. [JPA] @OnDelete VS cascade = CascadeType.REMOVE 관계형 DB의 데이터를 삭제할 때 사용하는 @OnDelete와 cascade = CascadeType.REMOVE의 차이를 알아보자! @OnDelete DDMS 레벨에서 작동 @OnDelete(action = OnDeleteAction.CASCADE) DDL 생성시 cascade 제약 조건이 생성 됨. 여기서 DDL이란 Data Definition Language로 데이터 베이스를 정의하는 언어이며, CREATE, ALTER, DROP, TRUNCATE를 말한다. casecade=CascadeType.REMOVE JPA 레벨에서 작동 JPA가 부모 엔티티를 삭제할 때 연관된 자식 데이터에 대한 DELETE 쿼리를 실행 함 본인의 경우 부모와 자식의 1:N 관계일 때 아래 요구사항을 충족시켜야 했다. 요구.. 2021. 12. 13. [JPA] 데이터를 insert 하기 전에 select하는 이유 JPA를 이용하여 DB에 데이터를 insert하게 되면 id를 조건으로 select를 먼저 하고, insert를 하는 것을 확인할 수 있다. (JPA는 조회 후 데이터가 존재한다면 update를 실행하고 존재하지 않으면 insert를 실행한다.) 대량 데이터를 처리하려다 보니 savaAll을 사용하게 되었는데, xxxRepository.saveAll(entity); 1000건의 데이터를 한번에 등록하려면 select를 1000번 실행하는..... JPA가 편리하긴 한데.. 이런 부분은.. 참 그렇다 그래서 save() 메소드가 어떻게 처리되고 있는지 살펴봤다. @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { e.. 2021. 12. 2. [JPA] @OneToMany - 자식 테이블(관계 Entity)의 데이터를 상황에 따라 가져오기 JPA를 사용하다 보면 LAZY 패치타입으로 relation이 달려 있는 엔티티를 조회할 때 n+1 문제가 발생하는 경우가 많다. 이럴 때는 @EntityGrapth만 달아주면 join하여 한번에 select할 수 있다. 아래는 예시이다. Product 테이블과 Sample 테이블은 1:N 관계이다. 따라서 sampleList에 @OneToMany 어노테이션을 설정해주었다. (반대로 Sample 엔티티에 Product를 @ManyToOne 설정해주어도 된다) @Entity @ToString @Table(name = "PRODUCT") public class Product{ @Id @Column(name = "PRODUCT_ID", columnDefinition ="VARCHAR(36)") private .. 2021. 11. 26. 이전 1 다음 728x90 반응형