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
- 9.2. Initialize a Database Using Hibernate
spring.jpa.hibernate.ddl-auto
- A.13. Schema Tooling Settings
SQL Logging
spring.jpa.show-sql
- A.3. JDBC Settings
spring.jpa.show-sql
Open Session in View
spring.jpa.open-in-view
OpenEntityManagerInViewInterceptor
- A Guide to Spring’s Open Session in View
- What is this spring.jpa.open-in-view=true property in Spring Boot?
Auditing
@EntityListeners(AuditingEntityListener.class)
AuditorAware
References
@MappedSuperclass
N + 1 Query Problem Solutions
- Fetch join
@BatchSize
@Fetch(FetchMode.SUBSELECT)
- Native query 구현
- QueryDSL 등 외부 라이브러리로 join