DB/JPA 13

[JPA] Hibernate MultipleBagFetchException

개요 JPA 쿼리를 통해 엔티티를 불러올 때 두 개 이상의 @OneToMany 관계를 갖는 엔티티를 함께 EAGER LOADING 할 때 아래와 같은 오류 메시지가 발생했습니다. 저 같은 경우 위와 같이 @OneToMany 관계가 다수인 엔티티를 FETCH JOIN을 통해 한 번에 불러오려고 할 때 MultipleBagFetchException 예외가 발생했습니다. * SampleInput과 SampleOutput을 모두 fetch type EAGER로 변환한다고 해도 동일한 에러가 발생합니다.) 원인 위와 같은 예외가 발생하는 원인을 파악하기 위해서는 우선 Bag의 정의를 살펴봐야 합니다. Bag은 중복된 요소를 허용하는 순서가 없는 컬렉션(MultiSet)이며 Java Collection에서는 Ba..

DB/JPA 2023.06.28

[JPA] 준영속(Detached) 상태 엔티티 수정하는 방법

개요 약 2년 전에 영속성 컨텍스트에 대해 정리했었습니다. https://jaimemin.tistory.com/1898 [JPA] PersistenceContext 간단 정리 개요 이번 게시글에서는 JPA 내부 구조 및 동작 방식을 파악하는데 중요한 개념인 PersistenceContext(영속성 컨텍스트)에 대해 알아보겠습니다. 1. EntityManagerFactory & EntityManager JPA 내부 구조를 살펴보 jaimemin.tistory.com 이후로는 주로 MyBatis가 적용된 프로젝트를 개발하여 JPA에 소홀하다가 최근에 JPA를 적용한 프로젝트를 개발하게 되어 복습을 진행하고 있습니다. 이번 게시글에서는 준영속 상태인 엔티티와 관련하여 중요한 개념인 변경 감지와 병합에 대해 정..

DB/JPA 2023.05.07

[JPA] JPQL 추가 정리

개요 지난 게시글(https://jaimemin.tistory.com/1997)에 이어 아래의 JPQL 개념에 대해 정리해보겠습니다. 경로 표현식 Fetch Join 엔티티 파라미터 Named 쿼리 벌크 연산 1. 경로 표현식 엔티티의 getter와 동일한 개념 ex) SELECT e.id FROM Employee e e.id와 같이 .을 찍어 객체 그래프를 탐색하는 것을 경로 표현식이라고 함 경로 표현식은 3가지 종류가 존재 상태 필드 단일 값 연관 필드 컬렉션 값 연관 필드 1.1 상태 필드(state field) 단순히 값을 저장하기 위한 필드 (e.name과 같은 필드) 경로 탐색의 끝 즉, 이후에 더 이상 점을 찍을 수 없음 ex) SELECT e.name, e.age FROM Employee ..

DB/JPA 2021.10.18

[JPA] JPQL 간단 정리

개요 JPA는 아래와 같이 다양한 쿼리 방법을 지원합니다. JPQL JPA Criteria QueryDSL Native SQL JDBC API 직접 적용 이번 게시글에서는 간단하게 위 쿼리 방법들을 설명한 후 JPQL 기본 문법과 기능에 대해 알아보겠습니다. 1. 다양한 쿼리 방법 소개 1.1 JPQL JPA가 테이블이 아닌 엔티티 객체를 중심으로 개발하는데, JPQL 역시 엔티티 객체를 대상으로 검색하는 쿼리 방법 (객체지향적인 것이 핵심) JPQL은 SQL을 추상화한 객체 지향 쿼리 언어 실제로 SQL 문법과 유사하여 ANSI 표준 키워드 전부 지원 (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN) 앞서 언급한 대로 JPQL은 엔티티 객체를 대상으로 쿼리 반면, SQL..

DB/JPA 2021.10.16

[JPA] 값 타입 정리

개요 JPA의 값 타입은 크게 기본값 타입, 임베디드 타입이 있고 이들로 이루어진 컬렉션을 값 타입 컬렉션이라고 합니다. 이번 게시글에서는 이 타입들에 대해서 알아보겠습니다. 1. 엔티티 타입 vs 값 타입 1.1 엔티티 타입 @Entity 어노테이션으로 정의된 객체 내부 데이터 즉, 속성이 변하더라도 식별자로 인해 지속해서 추적이 가능한 객체 사람 엔티티의 나이와 몸무게가 변하더라도 식별자로 인식 가능 1.2 값 타입 Primitive Type, Reference Type처럼 단순히 값으로 사용하는 자바 기본 타입 혹은 객체 식별자가 없고 값만 존재 따라서 값이 변하면 추적 불가 숫자 1을 2로 변경할 경우 완전히 다른 값으로 대체 2. 값 타입 2.1 기본값 타입 int와 String 같은 타입 생명..

DB/JPA 2021.09.29

[JPA] 프록시와 연관관계 관리 정리

개요 이번 게시글에서는 아래의 주제에 대해 알아보겠습니다. 프록시 즉시 로딩/지연 로딩 영속성 전이: CASCADE 고아 객체 1. 프록시 EntityManager의 find() 메서드는 DB를 통해서 실제 엔티티 객체를 조회하는 메서드 EntityManager의 getReference() 메서드는 DB 조회를 필요한 시점에 할 프록시 엔티티 객체를 조회하는 메서드 즉, getReference() 메서드가 호출되는 시점에는 쿼리가 실행되지 않음 프록시 객체는 실제 객체의 참조를 보관 프록시 객체를 호출 시 프록시 객체는 실제 객체의 메서드 호출 예제: 직원을 나타내는 클래스가 있고 해당 직원은 어떤 기업의 소속 설명을 위한 예제 printEmployeeAndCompany() 메서드를 호출할 경우 Empl..

DB/JPA 2021.09.14

[JPA] @MappedSuperclass

개요 사내 컨벤션으로 테이블마다 공통적으로 필요한 매핑 정보가 있을 수 있습니다. 예를 들자면, 데이터 생성 정보 혹은 데이터 수정 정보 같은 경우 운영할 때 필수적으로 필요한 정보이기 때문에 거의 모든 테이블에 해당 정보와 관련된 칼럼이 존재합니다. 위와 같은 케이스에서 DB 입장에서는 각각 다른 속성이지만 객체 입장에서는 공통 속성이므로 Entity마다 똑같은 필드를 넣는 것은 상당히 비효율적입니다. 이때 등장하는 개념이 @MappedSuperclass이며 이번 게시글에서는 @MappedSuperclass 어노테이션에 대해 알아보겠습니다. @MappedSuperclass 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공하며 속성을 같이 쓰고 싶을 때 적용 @MappedSuperclass는 상속관..

DB/JPA 2021.09.07

[JPA] 상속관계 매핑

개요 객체에는 상속이라는 개념이 있지만 관계형 데이터베이스에는 상속관계가 없습니다. 객체지향 언어인 Java를 사용하는 프레임워크에서 JPA를 적용하기 위해서는 객체 상속과 유사한 구조를 구현해야 하는데 마침 RDBMS는 객체 상속과 유사한 모델링 기법인 슈퍼타입/서브타입 구조를 제공합니다. 따라서, 이번 게시글에서는 객체의 상속, 구조와 DB의 슈퍼타입/서브타입 관계를 매핑하는 상속관계 매핑에 대해 알아보겠습니다. 1. 상속관계 매핑 상속관계 매핑은 슈퍼타입/서브타입 논리 모델을 실제 물리 모델로 구현하는 방법이며 아래와 같이 크게 3가지가 있습니다. 조인 전략 (JOINED) 싱글 테이블 전략 (SINGLE_TABLE) 구현 클래스마다 테이블 전략 (TABLE_PER_CLASS) 상속관계 매핑 관련된..

DB/JPA 2021.09.07

[JPA] 다양한 연관관계 매핑

개요 기존 포스팅(https://jaimemin.tistory.com/1900)에 이어 아래의 연관관계 매핑에 대해 알아보겠습니다. 다대일 [N:1] 일대다 [1:N] 일대일 [1:1] 다대다 [N:M] 1. 다대일 [N:1] 앞선 게시글(https://jaimemin.tistory.com/1900)에서 주로 다룬 내용 가장 많이 사용하는 연관관계 다대일 양방향 정리 복습을 하자면 Foreign Key가 있는 쪽이 연관관계의 주인 다, 즉 Many 쪽을 무조건 연관관계의 주인으로 지정 이론상 연관관계의 주인 쪽에만 연관관계를 맺은 객체를 넣어주면 되지만 순수한 객체 관계를 고려했을 대는 양쪽 객체에 모두 값을 입력해주는 것이 맞음 (테스트 케이스 작성 시 훨씬 수월해짐) 2. 일대다 [1:N] 다대일의 ..

DB/JPA 2021.08.31

[JPA] 연관관계 매핑 간단 정리

개요 기존 포스팅 최하단에 비고로 테이블 중심 설계가 아닌 객체 중심으로 설계할 경우 발생할 수 있는 문제에 대해 살짝 언급했었습니다. (https://jaimemin.tistory.com/1899) 이번 게시글에서는 연관관계 매핑에 대해 간단하게 알아보고 왜 테이블 중심으로 설계해야 하는지 이해해보겠습니다. 1. 객체 중심으로 모델링할 경우 문제점 객체를 테이블에 맞추어 모델링할 경우 참조 대신 외래 키 즉, Foreign Key를 그대로 사용 이럴 경우 외래 키 식별자를 직접 다루는 것이 문제 식별자를 직접 다루기 때문에 식별자로 다시 조회하는 상황이 발생하는데, 이런 방식은 객체지향적이지 않음 정리를 하자면, 객체를 테이블에 맞추어 데이터 중심으로 모델링할 경우 협력 관계를 만들어낼 수 없음 테이블..

DB/JPA 2021.08.28