스프링 데이터 JPA #Reference:지속 엔티티
참조 문서
5. JPA 리포지토리
이 장에서는 JPA에 대한 리포지토리 지원에 대한 전문성을 설명합니다. 이는“ Spring Data Repositories 작업 ”에서 설명 된 핵심 저장소 지원을 기반으로합니다 . 여기에 설명 된 기본 개념을 제대로 이해했는지 확인하십시오.
5.1. 소개
이 섹션에서는 다음 중 하나를 통해 Spring Data JPA를 구성하는 기본 사항에 대해 설명합니다.
- " 스프링 네임 스페이스 "(XML 구성)
- " 주석 기반 구성 "(자바 구성)
5.1.1. 스프링 네임 스페이스
Spring Data의 JPA 모듈에는 저장소 Bean을 정의 할 수있는 사용자 정의 네임 스페이스가 포함되어 있습니다. 또한 JPA에 특화된 특정 기능 및 요소 속성도 포함합니다. 일반적으로 JPA 저장소는 repositories
다음 예제와 같이 요소 를 사용하여 설정할 수 있습니다 .
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<jpa:repositories base-package="com.acme.repositories" />
</beans>
repositories
요소를 사용하면 “ 리포지토리 인스턴스 생성 ”에 설명 된대로 스프링 데이터 리포지토리를 찾습니다 . 그 외에도 @Repository
JPA 지속성 공급자가 던진 예외를 Spring의 DataAccessException
계층 구조 로 변환 할 수 있도록 주석이 달린 모든 Bean에 대해 지속성 예외 변환을 활성화 합니다.
사용자 정의 네임 스페이스 속성
repositories
JPA 네임 스페이스는 요소 의 기본 속성 외에도 저장소 설정을보다 세부적으로 제어 할 수있는 추가 속성을 제공합니다.
|
요소에 |
|
요소에 |
Spring Data JPA에는 명시 적 정의가 없는 경우 PlatformTransactionManager 이름 지정된 Bean이 있어야합니다 . transactionManager transaction-manager-ref |
5.1.2. 주석 기반 구성
스프링 데이터 JPA 리포지토리 지원은 다음 예제와 같이 XML 네임 스페이스를 통해서뿐만 아니라 JavaConfig를 통해 주석을 사용하여 활성화 할 수 있습니다.
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
전자는 create LocalContainerEntityManagerFactoryBean 뿐만 아니라 EntityManagerFactory 예외 변환 메커니즘에도 참여하므로 직접 작성 하지 말아야 합니다 EntityManagerFactory . |
앞의 구성 클래스는의 EmbeddedDatabaseBuilder
API를 사용하여 임베디드 HSQL 데이터베이스를 설정합니다 spring-jdbc
. 그런 다음 Spring Data EntityManagerFactory
는 샘플 지속성 공급자로 Hibernate 를 설정 하고 사용합니다. 여기에 선언 된 마지막 인프라 구성 요소는 JpaTransactionManager
입니다. 마지막으로이 예제 @EnableJpaRepositories
는 XML 네임 스페이스와 동일한 속성을 갖는 어노테이션 을 사용하여 Spring Data JPA 저장소를 활성화 합니다. 기본 패키지가 구성되어 있지 않으면 구성 클래스가 상주하는 패키지를 사용합니다.
5.1.3. 부트 스트랩 모드
기본적으로 Spring Data JPA 저장소는 기본 Spring Bean입니다. 그것들은 싱글 톤 범위이며 열심히 초기화됩니다. 시작하는 동안 이미 EntityManager
검증 및 메타 데이터 분석을 위해 JPA와 상호 작용 합니다. Spring Framework는 EntityManagerFactory
백그라운드 스레드에서 JPA의 초기화를 지원합니다. 프로세스는 일반적으로 Spring 애플리케이션에서 상당한 시작 시간을 소비하기 때문입니다. 백그라운드 초기화를 효과적으로 사용하려면 JPA 리포지토리를 가능한 한 늦게 초기화해야합니다.
Spring Data JPA 2.1 부터 다음 값을 취하는 주석 또는 XML 네임 스페이스 BootstrapMode
를 통해 구성 할 수 있습니다 @EnableJpaRepositories
.
DEFAULT
(default) —로 명시 적으로 주석을 달지 않는 한 리포지토리가 간절히 인스턴스화됩니다@Lazy
. Lazification은 클라이언트 Bean이 저장소의 인스턴스를 필요로하지 않는 경우에만 유효합니다. 저장소 Bean의 초기화가 필요합니다.LAZY
— 모든 저장소 Bean을 암시 적으로 선언하고 지연 초기화 프록시가 작성되어 클라이언트 Bean에 주입되도록합니다. 즉, 클라이언트 Bean이 단순히 인스턴스를 필드에 저장하고 초기화 중에 저장소를 사용하지 않으면 저장소가 인스턴스화되지 않습니다. 리포지토리 인스턴스는 리포지토리와 처음 상호 작용할 때 초기화되고 확인됩니다.DEFERRED
— 기본적으로와 동일한 작동 모드LAZY
이지만ContextRefreshedEvent
응용 프로그램이 완전히 시작되기 전에 리포지토리가 확인되도록 리포지토리 초기화를 트리거합니다 .
추천
기본 부트 스트랩 모드에서 비동기 JPA 부트 스트랩 스틱을 사용하지 않는 경우
JPA를 비동기 적으로 부트 스트랩하는 경우 DEFERRED
, 스프링 데이터 JPA 부트 스트랩 EntityManagerFactory
자체가 다른 모든 애플리케이션 컴포넌트를 초기화하는 것보다 시간이 오래 걸리는 경우 에만 설정을 기다릴 수 있으므로 합리적인 기본값 입니다. 여전히 응용 프로그램이 신호를 보내기 전에 리포지토리가 올바르게 초기화되고 유효성이 검사되도록합니다.
LAZY
테스트 시나리오 및 로컬 개발에 적합한 선택입니다. 리포지토리가 제대로 부트 스트랩되거나 응용 프로그램의 다른 부분을 테스트하는 경우 모든 리포지토리에 대한 확인을 실행하면 시작 시간이 불필요하게 증가 할 수 있습니다. 단일 리포지토리 만 초기화해야하는 응용 프로그램의 일부에만 액세스하는 로컬 개발에도 동일하게 적용됩니다.
5.2. 지속 엔티티
이 섹션에서는 Spring Data JPA로 엔티티를 유지 (저장)하는 방법에 대해 설명합니다.
5.2.1. 엔티티 저장
CrudRepository.save(…)
메소드를 사용하여 엔티티 저장을 수행 할 수 있습니다 . 기본 JPA를 사용하여 지정된 엔티티를 유지하거나 병합합니다 EntityManager
. 엔티티가 아직 지속되지 않은 경우 Spring Data JPA는 entityManager.persist(…)
메소드를 호출하여 엔티티를 저장합니다 . 그렇지 않으면 entityManager.merge(…)
메소드를 호출합니다 .
엔티티 상태 감지 전략
Spring Data JPA는 엔티티가 새로운 것인지 아닌지를 감지하기 위해 다음 전략을 제공합니다.
- 버전 특성 및 ID 특성 검사 ( 기본값 ) : 기본적으로 Spring Data JPA는 기본이 아닌 유형의 버전 특성이 있는지 먼저 검사합니다. 값이 인 경우 엔터티가있는 경우 새 것으로 간주됩니다
null
. 그러한 버전 속성이없는 Spring Data JPA는 주어진 엔티티의 identifier 속성을 검사합니다. 식별자 속성이null
인 경우 엔터티는 새 것으로 간주됩니다. 그렇지 않으면 새로운 것이 아니라고 가정합니다. - 구현
Persistable
: 엔티티Persistable
가을 구현하는 경우 Spring Data JPA는 새 감지를isNew(…)
엔티티 의 메소드에 위임합니다 . 자세한 내용은 JavaDoc 을 참조하십시오. - 구현
EntityInformation
: 서브 클래스를 작성하고 그에 따라 메소드를 대체하여 구현에EntityInformation
사용 된 추상화 를 사용자 정의 할 수 있습니다 . 그런 다음 사용자 정의 구현을 Spring Bean으로 등록해야합니다 . 이것은 거의 필요하지 않습니다. 자세한 내용은 JavaDoc 을 참조하십시오.SimpleJpaRepository
JpaRepositoryFactory
getEntityInformation(…)
JpaRepositoryFactory
옵션 1은 식별자가 항상 아닌 것과 같이 수동으로 할당 된 식별자를 사용하는 엔터티에 대한 옵션이 아닙니다 null
. 이 시나리오의 일반적인 패턴은 새 인스턴스를 표시하기 위해 기본적으로 임시 플래그가있는 공통 기본 클래스를 사용하고 JPA 라이프 사이클 콜백을 사용하여 지속성 조작에서 해당 플래그를 뒤집는 것입니다.
@MappedSuperclass
public abstract class AbstractEntity<ID> implements Persistable<ID> {
@Transient
private boolean isNew = true; (1)
@Override
public boolean isNew() {
return isNew; (2)
}
@PrePersist (3)
@PostLoad
void markNotNew() {
this.isNew = false;
}
// More code…
}
1 | 새 상태를 유지할 플래그를 선언하십시오. 데이터베이스에 유지되지 않도록 일시적입니다. |
2 | 의 구현에 플래그를 돌아 Persistable.isNew() 봄 데이터 저장소를 호출할지 여부를 알 수 있도록 EntityManager.persist() 나 ….merge() . |
3 | JPA 엔티티 콜백을 사용하여 메소드를 선언 save(…) 하여 지속성 제공자에 의한 저장소 호출 또는 인스턴스 작성 후 기존 엔티티를 표시하도록 플래그를 전환 하십시오. |
Spring Data JPA - Reference DocumentationOliver Gierke,Thomas Darimont,Christoph Strobl,Mark Paluch,Jay Bryant
version 2.3.1.RELEASE,2020-06-10 2.3.1.RELEASE © 2008-2019 The original authors. Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. |