반응형

Hibernate

    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..

    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% 감소 시..

    JPA 매핑 어노테이션 - DDL 2

    엔티티 매핑에서 사용될 컬럼의 필드 유형을 설정하는 매핑 어노테이션을 정리해보자. @Column 테이블에서 사용 되는 컬럼이라는 필드를 지정해줄때 사용하며 name, nullable(기본이 true) 등의 설정을 해줄 수 있다. 12@Column(name = "NAME", length = 10, nullable = true)private String userName;cs @Enumerated 자바의 enum 타입을 매핑할 때 사용한다. 속성으로 EnumType.ORDINAL과 EnumType.STRING이 존재하는데 이름 그대로 ORDINAL은 순서를 STRING은 Enum의 이름을 저장한다12345678910111213141516171819202122232425262728public class Memb..

    JPA 매핑 어노테이션 - DDL

    JPA 매핑에 사용되는 어노테이션은 크게 유형에 따라 4가지로 나누어진다.유형어노테이션객체와 테이블 매핑@Entity, @Table 기본 키 매핑@Id필드와 컬럼 매핑@Column연관관계 매핑@ManyToOne, @JoinColumn @EntityJPA를 사용해서 테이블과 매핑할 클래스에는 무조건 붙혀야하는 어노테이션이다. 속성으로 name을 지정할 수 있다. 안할 시 기본 클래스 이름으로 한다.1@Entity(name = "Member")cs - 기본 생성자가 필수로 있어야 한다. - final 클래스와 private 생성자는 할 수 없다. @Table엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑하는 엔티티이름으로 대신한다. -name, catalog, schema, uniqueConstraints..

    JPA 영속성 컨테이너에서 엔티티 사용하기

    JPA에서 사용하는 영속성 컨테이너에서 사용되는 엔티티에 대해 정리해보자. 엔티티 생명주기영속성 컨테이너(Persistent Context)에서 존재하는 엔티티의 생명주기를 정리해보자. 엔티티는 4가지 상태가 존재한다. 이름 특징 비영속 영속성 컨텍스트와 전혀 관계가 없는 상태 (엔티티 객체가 생성만 되고 컨텍스트와 아무런 연관이 없는경우) 영속 영속성 컨텍스트에 저장된 상태 (엔티티 매니저를 통해서 영속성 컨텍스트에 저장되고 영속성 컨텍스트가 관리한다.) 준영속 영속성 컨텍스트에 저장되었다가 분리된 상태 (영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다. close(), clear(), detach() 메소드를 사용하면 준영속 상태가 된다. 삭제 삭..

    JPA persistence 설정 및 Entity manager 설명

    JPA를 사용하기 위해서는 persistence.xml을 이용하여 사용 설정을 해야한다. persistence-unit에 이름을 설정하고 각종 데이터베이스를 설정한다. 구조는 다음과 같이 되어있다.12345

    JPA 기본 어노테이션 설명

    JPA에서 사용되는 기본적인 어노테이션 몇개를 정리해보자. @Entity- 클래스와 테이블과 매핑한다고 JPA에게 알려준다. 이렇게 @Entity가 사용될 클래스를 엔티티 클래스라고 한다. @Table- 엔티티 클래스에 매핑할 테이블 정보를 알려준다. (이 어노테이션을 생략하면 클래스 이름을 테이블정보로 매핑한다.) @Id- 엔티티 클래스의 필드를 테이블에 기본키로 매핑한다. (데이터베이스는 엔티티를 구별할때 이 키값으로 구분한다.) @Column- 필드를 컬럼에 매핑한다. 매핑 정보가 없는 필드- @Column을 생략하면 필드명을 사용해서 컬럼명과 매핑하게 된다. 만약 대소문자를 데이터베이스가 구분할 경우에는 꼭 위에 @Column어노테이션을 사용해서 진행해야한다. #Dialect(방언)- 데이터베이스..

반응형