Skip to main content

Spring Data JPA

JPA

  • em.persist(): 엔티티 객체를 영속성 컨텍스트에 저장
  • 엔티티 객체의 setter 메서드: 영속성 컨텍스트에 저장된 엔티티 객체의 정보를 업데이트
  • em.remove(): 엔티티 객체를 영속성 컨텍스트에서 제거
  • em.flush(): 영속성 컨텍스트의 변경 사항을 테이블에 반영
  • tx.commit(): tx.begin() 이후 변경 사항을 테이블에 반영, 내부적으로 em.flush() 호출

References

엔티티 매핑

  • @Entity: 클래스 레벨에 추가, JPA 엔티티 지정
  • @Table: 엔티티와 매핑할 테이블을 지정, 추가하지 않으면 엔티티 이름과 동일한 테이블에 매핑
  • @Entity, @Id - 필수
  • JPA 기본키 생성 전략
    • IDENTITY: 데이터베이스에 위임 - 별도의 commit 없이도 DB에 저장됨
    • SEQUENCE: 데이터베이스에서 제공하는 시퀀스를 사용
    • TABLE: 별도의 키 생성 테이블 사용
    • AUTO: JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택
  • 원시 타입 필드의 경우 null을 담을 수 없기 때문에 최소한 @Column(nullable = false) 을 추가하는 것이 에러를 방지하는 데에 좋다.
  • 시간 및 날짜
    • java.util.Date, java.util.Calendar: @Temporal 추가 필수
    • LocalDate, LocalDateTime: @Temporal 생략 가능
  • @Transient: 테이블 컬럼과 매핑하지 않는 필드 표시
  • @Enumerated 사용시 테이블에 저장된 enum 순서 번호와 엔티티 enum에 정의된 순서가 불일치하게 되는 문제가 발생하지 않도록 EnumType.ORDINAL대신 EnumType.STRING을 사용하는 것이 좋다.

References

엔티티 간 연관 관계 매핑

  • @ManyToOne
  • @JoinColumn
  • @OneToMany(mappedBy = "fieldName")

References

Spring Data JPA를 통한 데이터 엑세스 계층 구현

Spring Data JPA - Reference Documentation

JPQL

Java Persistence/JPQL - Wikibooks, open books for an open world

Further Reading

Spring Data JPA Properties in Spring Boot application.yml

spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:test
jpa:
hibernate:
ddl-auto: create # 스키마 자동 생성
show-sql: true # SQL 쿼리 출력
properties:
hibernate:
format_sql: true
hbm2ddl:
# import.sql에서 하나의 쿼리문을 여러 줄로 나눠서 써도 인식하도록 하는 설정
import_files_sql_extractor: org.hibernate.tool.schema.internal.script.MultiLineSqlScriptExtractor
open-in-view: false

SQL Initialization

SQL Logging

Open Session in View

Auditing

  • @EntityListeners(AuditingEntityListener.class)
  • AuditorAware

References

@MappedSuperclass

MappedSuperclass

N + 1 Query Problem Solutions

  1. Fetch join
  2. @BatchSize
  3. @Fetch(FetchMode.SUBSELECT)
  4. Native query 구현
  5. QueryDSL 등 외부 라이브러리로 join

DSLs for Queries