반응형

JPA

    JPA querydsl에서 oneToMany fetchjoin시 offset, limit를 사용할경우 result list가 distinct가 되는 이유

    Jpa join시 중복 엔티티 출력 현상 교실 (Classes 엔티티) package com.wedul.jpa.school; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.List; @Getter @NoArgsConstructor @Entity @Table public class Classes { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String className; @OneToMany(cascade = CascadeType.AL..

    query specified join fetching, but the owner of the fetched association was not present in the select list 설명과 문제해결

    package com.wedul.jpa.school; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.List; @Getter @NoArgsConstructor @Entity @Table public class Classes { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String className; @OneToMany(cascade = CascadeType.ALL, mappedBy = "classes", orphanRemoval =..

    MultipleBagFetchException 문제 발생

    엔티티에 연관되어 있는 다른 테이블의 데이터를 2개 이상 fetch join하려고 시도했다. 예를 들어보면 아래와 같이 Classes엔티티에 oneToMany관계인 student와 teacher 두개에 엔티티를 fetch join으로 가지고 오고자 했다. Classes.java package com.wedul.jpa.school; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.List; @Getter @NoArgsConstructor @Entity @Table public class Classes { @Id @GeneratedValu..

    QueryDsl에서 delete limit 문법을 사용할 수 없는 이유

    mariadb를 사용하여 서비스 개발 중 delete로 필요한 row를 지울 때 limit을 줘서 지우려고 시도를 했었다. mariadb 문법에서는 정상적으로 동작이 가능한 문법이기 때문에 당연히 제공할거라고 생각했다. 하지만 JPADeleteClause에서는 limit을 찾아볼 수 없어 사용할 수 없었다. http://www.querydsl.com/static/querydsl/4.1.4/apidocs/com/querydsl/jpa/impl/JPADeleteClause.html 그 이유는 jpa의 dialect 때문이었다. target DBMS가 변경되어도 쿼리를 수정할 필요가 없는 장점을 제공해주는 jpa의 dialect 때문에 공통 문법이 아닌 특정 specific한 dbms 문법은 제공하지 못하는 ..

    [번역] 2-2. Domain 모델 (Enum, UUID, Date, Attribute, Generated Properties)

    2.3.7 Enums 매핑 Hibernate는 기본값 유형으로써 다양한 방법으로 Java Enum의 매핑을 지원한다. @Enumrated 기본적인 JPAdml enums의 매핑 방법은 @Enumrated 또는 @MapKeyEnumrated 애노테이션을 통해 javax.persistence.EnumType에 표시된 두 가지 전략 중 하나에 따라 enum 값이 저장된다는 원칙에 따라 동작한다. ORDINAL - java.lang.Enum#ordinal에 기재된대로 Enum 클래스 내에서 Enum값의 순서에 따라 저장된다 STRING - java.lang.Enum#name 방식에 기재에 따라 Enum값의 이름에 따라서 저장된다. 아래 예시로 PhoneType이라는 Enum이 있다고 가정해보자. public e..

    [번역] 2-1. Domain 모델 (매핑 타입, 네이밍 전략, Basic Type - 1)

    2. 도메인 모델 도메인 모델이라는 단어는 데이터 모델링이라는 영역에서 비롯된다. 이것은 작업을 하고 있는 도메인의 모델로 묘사되기도 하고 때때로 이를 persistent classes라고 부른다. 궁극적으로 애플리케이션 도메인 모델은 ORM에서 중심이 되는 단어이다. 이것들은 매핑하고 싶은 클래스들로 구성된다. Hibernate는 POJO/JAVA Bean 프로그래밍 모델을 따를 때 가장 잘 동작한다. 그러나 이런 규칙은 어려운 요구사항은 아니다. 게다가 Hibernate는 persistence 객체의 특성에 대해 매우 조금만 담당하고 있다. 사실 Map 인스턴스 트리등을 사용하여 다른 방법으로도 domain 모델 구현이 가능하다. 2.1 매핑 타입 Hibernate는 Java와 JDBC 애플리케이션의..

    [번역] Hibernate Document 서문, 시스템 요구사항, 아키텍처

    서문 객체 지향 소프트웨어와 관계형 데이터베이스를 함께 쓰는 것은 귀찮고 시간이 많이 소비된다. 데이터가 관계형 데이터베이스와 객체 사이에서 표현되는 방식의 패러다임 불일치로 인해 개발 비용이 증가하게 된다. Hibernate는 자바 환경에서 객체/릴레이션 매핑의 솔루션이다. 객체/관계형 매핑이라는 말은 객체 모델 표현 방식으로 부터 관계형 데이터를 매핑하는 기술을 의미한다. Hibernate는 자바 클래스로 데이터베이스를 매핑하는 것 뿐 아니라 데이터 쿼리 및 탐색 기능을 제공한다. 이는 SQL과 JDBC로 데이터를 핸들링하는 시간을 상당히 줄여줄 수 있다. Hibernate의 디자인 목표는 SQL과 JDBC로 데이터를 처리하는 필요성을 제거함으로써 개발다의 데이터 관련 프로그램 작업의 95% 감소 시..

    [토이프로젝트] TimeLine 개선

    한동안 잠시 멈췄다가 다시 열면서 내용을 추가 하고 싶었다. 타임라인의 목적은 개발에 관련 블로그 내용들과 채용 뉴스등을 한번에 보기 위해서 만든 서비스이다. 사실 내가 한번에 보고 싶은 욕구가 있어서 만들게 되었다. 그런데 채용이나 회사 블로그 뉴스등은 넣었는데 개인 블로그를 볼 수 있는 기능이 없어서 불편했는데 추가했다. 개인블로그 추가 그리고 메인 화면이 없어서 첫 화면을 설정하기가 애매했다. 그래서 메인화면도 summary해서 볼 수 있도록 추가했다. 메인화면 추가하면서 잘못된 @Transaction 어노테이션 사용으로 문제가 많았었다. 에러내용은 아래와 같다. org.hibernate.AssertionFailure: null id in entry (don't flush the Session af..

    JPA 다양한 Join 방법 정리 (N+1, queryDSL, fetch join)

    JPA를 사용하다 보면 join을 할 때가 많아진다. join을 어떠한 방법으로 하느냐에 따라서 수행되는 쿼리가 달라지고 성능에 문제가 발생하는 경우도 종종있다. 그래서 다양한 방식의 join 방식을 알아보고 방식에 따라 작업을 진행해 보자. 우선 사용될 entity 두 개를 설명하면 다음과 같다. @Getter @Entity @Table(name = "wedul_classes") @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor @Builder public class WedulClasses extends CommonEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY..

    DDD. 애거리루트 정리

    애그리거트는 관련된 객체를 하나의 군으로 묶어주는 것 으로 상위수준에서 모델을 조망하는 방법 중 하나이다. 애그리거트는 비슷한 속성을 가진 객체를 묶어놓은 것을 의미한다. 예를 들어 주문 시스템에 주문 관련 애그리거트는 Order, Receiver, OrderLine.. 등이 있고 회원정보에는 Member, MemberInfo등으로 나눌 수 있다. 각 애그리거트에 연관된 객체를 담고 있으며 유사하고 동일한 라이프 사이클을 보유하고 있다. 애거리거트 루트 애그리거트에서 가장 핵심이 되는 주체 즉, 애그리거트 전체를 관리하고 책임지는 주체를 애그리거트의 루트 엔티티라고 한다. 애그리거트내에 존재하는 모든 엔티티는 루트 엔티티와 직간접적으로 연결되어있다. 애거리거트 루트의 핵심 역할은 애거리거트의 일관성을 유..

반응형