Hibernate 애플리케이션 개발


Red Hat JBoss Enterprise Application Platform 7.4

Jakarta Persistence API(JPA) 또는 Hibernate 애플리케이션을 Red Hat JBoss Enterprise Application Platform용 개발 및 배포하고자 하는 개발자 및 관리자를 위한 지침 및 정보.

Red Hat Customer Content Services

초록

이 문서에서는 Red Hat JBoss Enterprise Application Platform을 사용하여 Jakarta Persistence 또는 Hibernate 애플리케이션을 개발 및 배포하려는 개발자와 관리자를 위한 정보를 제공합니다.

JBoss EAP 문서에 대한 피드백 제공

오류를 보고하거나 문서를 개선하기 위해 Red Hat Jira 계정에 로그인하여 문제를 제출하십시오. Red Hat Jira 계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.

절차

  1. 티켓을 생성하려면 다음 링크를 클릭하십시오.
  2. 문서 URL, 섹션 번호 를 포함하고 문제를 설명하십시오.
  3. 요약 에 문제에 대한 간략한 설명을 입력합니다.
  4. 설명에서 문제 또는 개선 사항에 대한 자세한 설명을 제공합니다. 문서에서 문제가 발생한 위치에 URL을 포함합니다.
  5. Submit 을 클릭하고 문제를 적절한 문서 팀으로 라우팅합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. 소개

1.1. Hibernate Core 정보

Hibernate Core는 Java 언어용 객체 관계 매핑 프레임워크입니다. 개체 지향 도메인 모델을 관계형 데이터베이스에 매핑하기 위한 프레임워크를 제공하므로 애플리케이션이 데이터베이스와의 직접적인 상호 작용을 방지할 수 있습니다. Hibernate는 영구적인 데이터베이스 액세스를 고수준 오브젝트 처리 기능으로 교체하여 객체 관계상의 임피던스 불일치 문제를 해결합니다.

1.2. Hibernate EntityManager

Hibernate EntityManager는 Jakarta Persistence 2.2 사양에 정의된 프로그래밍 인터페이스 및 라이프사이클 규칙을 구현합니다. Hibernate Annotations와 함께 이 래퍼는 성숙한 Hibernate Core 위에 독립 실행형 Jakarta Persistence 솔루션을 구현합니다. 프로젝트의 비즈니스 및 기술 요구에 따라 세 가지, 자카르타 지속성 프로그래밍 인터페이스 및 라이프사이클이 없는 주석 또는 순수 네이티브 Hibernate Core를 모두 사용할 수 있습니다. 항상 Hibernate 네이티브 API로 대체되거나 필요한 경우 네이티브 JDBC 및 SQL로 대체할 수 있습니다. JBoss EAP에 완전한 자카르타 지속성 솔루션을 제공합니다.

JBoss EAP 7.3 이상 릴리스는 Jakarta EE 8에 정의된 Jakarta Persistence 2.2 사양과 호환됩니다.

Hibernate는 사양에 추가 기능도 제공합니다. Jakarta Persistence 및 JBoss EAP를 시작하려면 JBoss EAP와 함께 제공되는 bean-validation,greeter 및 equipmentsink 빠른 시작을 참조하십시오.

Jakarta Persistence는 Jakarta Enterprise Beans 3 또는 최신 Jakarta Contexts and Dependency Injection과 같은 컨테이너에서 사용할 수 있으며 특정 컨테이너 외부에서 실행되는 독립 실행형 Java SE 애플리케이션에서 사용할 수 있습니다. 다음 프로그래밍 인터페이스와 아티팩트는 두 환경 모두에서 사용할 수 있습니다.

중요

Hibernate와 함께 보안 관리자를 사용하려면 EntityManagerFactory 가 JBoss EAP 서버에서 부트스트랩된 경우에만 Hibernate가 이를 지원합니다. 애플리케이션에서 EntityManagerFactory 또는 SessionFactory 를 부트스트랩하는 경우 지원되지 않습니다.

EntityManagerFactory
엔터티 관리자 팩토리는 엔터티 관리자 인스턴스를 제공하고, 모든 인스턴스가 동일한 데이터베이스에 연결하도록 구성되고, 특정 구현에서 정의한 것과 동일한 기본 설정을 사용하도록 구성됩니다. 여러 엔터티 관리자 팩토리를 준비하여 여러 데이터 저장소에 액세스할 수 있습니다. 이 인터페이스는 기본 Hibernate의 SessionFactory와 유사합니다.
EntityManager
EntityManager API는 특정 작업 단위의 데이터베이스에 액세스하는 데 사용됩니다. 영구 엔터티 인스턴스를 생성 및 제거하고, 기본 키 ID로 엔터티를 찾고, 모든 엔터티를 쿼리하는 데 사용됩니다. 이 인터페이스는 Hibernate의 세션과 유사합니다.
지속성 컨텍스트
지속성 컨텍스트는 영구 엔터티 ID에 대해 고유한 엔터티 인스턴스가 있는 엔터티 인스턴스 집합입니다. 지속성 컨텍스트 내에서 엔터티 인스턴스 및 해당 라이프사이클은 특정 엔터티 관리자가 관리합니다. 이 컨텍스트의 범위는 트랜잭션 또는 확장된 작업 단위일 수 있습니다.
지속성 단위
지정된 엔터티 관리자가 관리할 수 있는 엔터티 유형 집합은 지속성 유닛에서 정의합니다. 지속성 유닛은 애플리케이션에서 관련 또는 그룹화된 모든 클래스 집합을 정의하고 단일 데이터 저장소에 매핑에 배치해야 합니다.
컨테이너 관리 엔터티 관리자
컨테이너에서 라이프사이클을 관리하는 엔터티 관리자입니다.
애플리케이션 관리 엔터티 관리자
애플리케이션에서 라이프사이클을 관리하는 엔터티 관리자.
자카르타 트랜잭션 엔티티 관리자
자카르타 트랜잭션과 관련된 엔터티 관리자.
resource-local 엔터티 관리자
리소스 트랜잭션을 사용하는 엔터티 관리자(Norizon Transactions 트랜잭션이 아님).

추가 리소스

  • 빠른 시작을 다운로드하고 실행하는 방법에 대한 자세한 내용은 JBoss EAP Getting Started Guide 의 빠른 시작 예제 사용을 참조하십시오.
  • 보안 관리자에게 대한 자세한 내용은 JBoss EAP의 Java Security Manager 를 참조하십시오. 서버 보안 구성 방법 .

2장. Hibernate 구성

2.1. Hibernate 구성

애플리케이션 서버 내부와 독립 실행형 애플리케이션의 엔터티 관리자에 대한 구성은 지속성 아카이브에 있습니다. 지속성 아카이브는 META-INF/ 폴더에 있는 persistence.xml 파일을 정의해야 하는 JAR 파일입니다.

persistence.xml 파일을 사용하여 데이터베이스에 연결할 수 있습니다. 이 작업을 수행하는 방법에는 두 가지가 있습니다.

  • JBoss EAP의 datasources 하위 시스템에서 구성된 데이터 소스 지정.

    jta-data-source 는 이 지속성 유닛이 매핑하는 데이터 소스의 Java Naming 및 Directory Interface 이름을 가리킵니다. 여기에서 java:jboss/datasources/ExampleDS 는 JBoss EAP에 포함된 H2 DB 를 가리킵니다.

    persistence.xml 파일의 object-relational-mapping

    <persistence>
       <persistence-unit name="myapp">
          <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
          <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
          <properties>
             ... ...
          </properties>
       </persistence-unit>
    </persistence>

  • 연결 속성을 지정하여 명시적으로 persistence.xml 파일 구성.

    persistence.xml 파일에서 연결 속성을 지정하는 예

    <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
    <property name="javax.persistence.jdbc.user" value="sa"/>
    <property name="javax.persistence.jdbc.password" value=""/>
    <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:."/>

    연결 속성의 전체 목록은 persistence.xml 파일에서 Connection Properties Configurable을 참조하십시오.

런타임 시 Hibernate의 동작을 제어하는 다양한 속성이 있습니다. 모두 선택 사항이며 적절한 기본값이 있습니다. 이러한 Hibernate 속성은 모두 persistence.xml 파일에서 사용됩니다. 구성 가능한 모든 Hibernate 속성의 전체 목록은 Hibernate Properties 를 참조하십시오.

2.2. 2차 캐시

2.2.1. 두 번째 수준 캐시 정보

두 번째 수준 캐시는 애플리케이션 세션 외부에서 지속되는 정보를 보관하는 로컬 데이터 저장소입니다. 캐시는 애플리케이션과 별도로 데이터를 유지하여 런타임을 개선하여 지속성 프로바이더가 관리합니다.

JBoss EAP는 다음과 같은 목적으로 캐싱을 지원합니다.

  • 웹 세션 클러스터링
  • 상태 저장 세션 빈 클러스터링
  • SSO 클러스터링
  • Hibernate 두 번째 수준 캐시
  • 자카르타 지속성 두 번째 수준 캐시
주의

각 캐시 컨테이너는 repldist 캐시를 정의합니다. 이러한 캐시는 사용자 애플리케이션에서 직접 사용해서는 안 됩니다.

2.2.2. Hibernate에 대해 두 번째 레벨 캐시 구성

Hibernate의 두 번째 수준 캐시 역할을 하는 Infinispan의 구성은 다음 두 가지 방법으로 수행할 수 있습니다.

Hibernate 네이티브 애플리케이션을 사용하여 Hibernate용 두 번째 레벨 캐시 구성
  1. 배포의 클래스 경로에 hibernate.cfg.xml 파일을 생성합니다.
  2. 다음 XML을 hibernate.cfg.xml 파일에 추가합니다. XML은 <session-factory> 태그 내에 있어야 합니다.

    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.region.factory_class">org.jboss.as.jpa.hibernate5.infinispan.InfinispanRegionFactory</property>
  3. 애플리케이션 내에서 Hibernate 네이티브 API를 사용하려면 MANIFEST.MF 파일에 다음 종속성을 추가해야 합니다.

    Dependencies: org.infinispan,org.hibernate

3장. Hibernate 주석

3.1. Hibernate 주석

org.hibernate.annotations 패키지에는 표준 Jakarta Persistence 주석 위에 Hibernate에서 제공하는 몇 가지 주석이 포함되어 있습니다.

Expand
표 3.1. 일반 주석
주석설명

검사

클래스, 속성 또는 수집 수준에서 정의할 수 있는 임의의 SQL 검사 제약 조건입니다.

변경할 수 없음

엔터티 또는 컬렉션을 변경할 수 없음으로 표시합니다. 주석이 없음은 요소가 변경됨을 의미합니다.

애플리케이션에서 변경할 수 없는 엔터티를 업데이트할 수 없습니다. 변경 불가능한 엔터티에 대한 업데이트는 무시되지만 예외는 발생하지 않습니다.

@immutable 을 컬렉션에 배치하면 컬렉션은 변경할 수 없으므로 컬렉션에 추가 및 삭제가 허용되지 않습니다. 이 경우 HibernateException 이 발생합니다.

Expand
표 3.2. 캐싱 엔티티
주석설명

캐시

캐싱 전략을 루트 엔터티 또는 컬렉션에 추가합니다.

Expand
표 3.3. 수집 관련 주석
주석설명

MapKeyType

영구 맵의 키 유형을 정의합니다.

ManyToAny

다양한 엔터티 유형을 가리키는 ToMany 연결을 정의합니다. 엔터티 유형 일치는 메타데이터 차별자 열을 통해 수행됩니다. 이러한 유형의 매핑은 경계만 있어야 합니다.

OrderBy

SQL 순서를 사용하여 컬렉션 주문(HQL 순서 아님).

OnDelete

컬렉션, 배열 및 결합된 하위 클래스 삭제에 사용할 전략입니다. 현재 보조 테이블의 OnDelete 는 지원되지 않습니다.

Persister

사용자 지정 지속자를 지정합니다.

sort

수집 정렬(Java 레벨 정렬).

다음과 같습니다.

컬렉션의 요소 Entity 또는 target 엔터티에 추가할 절입니다. 절은 SQL로 작성됩니다.

WhereJoinTable

collection 조인 테이블에 추가할 절이 있습니다. 절은 SQL로 작성됩니다.

Expand
표 3.4. CRUD 작업을 위한 사용자 지정 SQL
주석설명

로더

Hibernate 기본 FIND 메서드를 덮어씁니다.

SQLDelete

Hibernate 기본 DELETE 메서드를 덮어씁니다.

SQLDeleteAll

Hibernate 기본 DELETE ALL 메서드를 덮어씁니다.

SQLInsert

Hibernate 기본 INSERT INTO 메서드를 덮어씁니다.

SQLUpdate

Hibernate 기본 UPDATE 방법을 덮어씁니다.

하위 선택

변경 불가능한 읽기 전용 엔터티를 지정된 SQL 하위 선택 표현식에 매핑합니다.

동기화

자동 플러시가 올바르게 수행되고 파생된 엔터티에 대한 쿼리가 오래된 데이터를 반환하지 않는지 확인합니다. Subselect 와 함께 주로 사용됩니다.

Expand
표 3.5. 엔터티
주석설명

cascade

연관에 캐스캐드 전략 적용.

엔터티

표준 @Entity 에 정의된 것 외에도 필요할 수 있는 추가 메타데이터를 추가합니다.

  • mutable: 이 엔티티가 변경 가능한지 여부
  • dynamicInsert: 동적 SQL을 삽입 허용
  • dynamicUpdate: 동적 SQL 업데이트 허용
  • selectBeforeUpdate: 객체가 실제로 수정되지 않는 한 Hibernate가 SQL UPDATE를 수행하지 않도록 지정합니다.
  • Polymorphism : 엔터티 다형성이 PolymorphismType.IMPLICIT (기본값) 또는 PolymorphismType.EXPLICIT인지 여부
  • OpimisticLock: 최적의 잠금 전략 (OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTY 또는 OptimisticLockType.ALL)

    참고

    주석 "Entity"는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 개별 속성 또는 값은 주석이 되어야 합니다.

다형성

다형성 Hibernate의 유형을 정의하는 데 사용되는 Hibernate는 엔터티 계층 구조에 적용됩니다.

proxy

특정 클래스의 지연 및 프록시 구성.

테이블

1차 또는 보조 테이블에 대한 보완 정보.

테이블

테이블의 복수 주석.

대상

명시적 타겟을 정의하여 반영 및 일반 해결을 방지합니다.

Tuplizer

엔터티 또는 구성 요소에 대한 매개 변수를 정의합니다.

Tuplizers

엔터티 또는 구성 요소에 대한 매개 변수 집합을 정의합니다.

Expand
표 3.6. 가져오기 중
주석설명

BatchSize

SQL 로드를 위한 배치 크기.

FetchProfile

가져오기 전략 프로필을 정의합니다.

FetchProfiles

@FetchProfile 에 대한 복수형 주석.

LazyGroup

엔터티 특성을 동일한 그룹에 속하는 다른 모든 속성과 함께 가져와야 함을 지정합니다. 엔터티 특성을 지연해서 로드하려면 바이트코드 개선이 필요합니다. 기본적으로 수집되지 않은 속성은 모두 DEFAULT 라는 하나의 그룹에 로드됩니다. 이 주석을 사용하면 그룹의 하나의 속성에 액세스할 때 서로 다른 속성 그룹을 함께 정의할 수 있습니다.

Expand
표 3.7. 필터
주석설명

필터

필터를 컬렉션의 엔터티 또는 대상 엔터티에 추가합니다.

FilterDef

필터 정의.

FilterDefs

필터 정의의 배열입니다.

FilterJoinTable

조인 테이블 컬렉션에 필터를 추가합니다.

FilterJoinTables

컬렉션에 @FilterJoinTable 을 여러 개 추가합니다.

필터

여러 개의 @Filter 추가.

ParamDef

매개 변수 정의입니다.

Expand
표 3.8. 기본 키
주석설명

생성됨

이 주석이 있는 속성은 데이터베이스에 의해 생성됩니다.

GenericGenerator

모든 종류의 Hibernate 생성기를 detyped 방식으로 설명하는 생성기 주석.

GenericGenerators

일반 생성자 정의의 배열입니다.

NaturalId

속성이 엔터티의 자연 ID의 일부임을 지정합니다.

매개변수

키/값 패턴.

RowId

Hibernate의 ROWID 매핑 기능 지원.

Expand
표 3.9. 상속
주석설명

디스크리미네이터-

차별자 공식을 루트 엔티티에 배치할 수 있습니다.

DiscriminatorOptions

Hibernate 특정 차별자 속성을 표현하는 선택적 주석입니다.

MetaValue

지정된 차별자 값을 해당 엔터티 유형에 매핑합니다.

Expand
표 3.10. JP-QL/HQL 쿼리 매핑
주석설명

NamedNativeQueries

Hibernate NamedNativeQuery 오브젝트를 보유하도록 NamedNativeQueries 를 확장합니다.

NamedNativeQuery

Hibernate 기능을 사용하여 NamedNativeQuery 를 확장합니다.

NamedQueries

Hibernate NamedQuery 오브젝트를 유지하기 위해 NamedQueries 를 확장합니다.

NamedQuery

Hibernate 기능을 사용하여 NamedQuery 를 확장합니다.

Expand
표 3.11. 간단한 속성 매핑
주석설명

AccessType

속성 액세스 유형.

열 배열을 지원합니다. 구성 요소 사용자 유형 매핑에 유용합니다.

ColumnTransformer

에서 값을 읽고 열에 값을 쓰는 데 사용되는 사용자 지정 SQL 표현식. 직접 객체 로딩/저장 및 쿼리에 사용합니다. 쓰기 표현식에는 값에 대한 정확히 하나의 '?' 자리 표시자가 포함되어야 합니다.

ColumnTransformers

@ColumnTransformer 에 대한 복수형 주석. 두 개 이상의 열에서 이 동작을 사용하는 경우 유용합니다.

Expand
표 3.12. 속성
주석설명

공식

대부분의 위치에서 @Column 대신 사용합니다. 공식은 유효한 SQL 조각이어야 합니다.

인덱스

데이터베이스 인덱스를 정의합니다.

JoinFormula

대부분의 위치에서 @JoinColumn 의 대체로 사용됩니다. 공식은 유효한 SQL 조각이어야 합니다.

부모

속성을 소유자(일반적으로 소유 엔터티)를 포인터로 참조합니다.

유형

Hibernate 유형.

TypeDef

Hibernate 유형 정의.

TypeDefs

Hibernate 유형 정의 배열.

Expand
표 3.13. 단일 연결 관련 주석
주석설명

Any

여러 엔터티 유형을 가리키는 ToOne 연결을 정의합니다. 따라 엔터티 유형 일치는 메타데이터 차별기 열을 통해 수행됩니다. 이러한 유형의 매핑은 경계만 있어야 합니다.

AnyMetaDef

@Any@ManyToAny 메타데이터를 정의합니다.

AnyMetaDefs

@Any@ManyToAny 메타데이터 집합을 정의합니다. 엔터티 수준 또는 패키지 수준에서 정의할 수 있습니다.

가져오기

지정된 연결에 사용되는 가져오기 전략을 정의합니다.

LazyCollection

컬렉션의 지연 상태를 정의합니다.

LazyToOne

ToOne 연결의 지연 상태를 정의합니다(즉, OneToOne 또는 ManyToOne).

찾을 수 없음

연관에서 요소를 찾을 수 없는 경우 수행할 작업.

Expand
표 3.14. 최적화된 잠금
주석설명

OptimisticLock

주석이 지정된 속성을 변경하면 엔터티 버전이 증가하게 됩니다. 주석이 없으면 속성이 최적화된 잠금 전략(기본값)에 포함됩니다.

OptimisticLocking

엔터티에 적용할 최적화된 잠금 스타일을 정의하는 데 사용됩니다. 계층 구조에서 루트 엔터티에만 유효합니다.

소스

버전 및 타임스탬프 버전 속성과 함께 선택적 주석입니다. 주석 값은 타임스탬프가 생성되는 위치를 결정합니다.

4장. Hibernate 쿼리 언어

4.1. Hibernate 쿼리 언어 정보

Jakarta Persistence 쿼리 언어 소개

Jakarta Persistence 쿼리 언어는 Jakarta Persistence 사양 의 일부로 정의된 플랫폼 독립적인 개체 지향 쿼리 언어입니다.

Jakarta Persistence 쿼리 언어는 관계형 데이터베이스에 저장된 엔터티에 대한 쿼리를 만드는 데 사용됩니다. SQL에 의해 크게 영향을 미치고, 해당 쿼리는 구문의 SQL 쿼리와 유사하지만 데이터베이스 테이블에서 직접 사용하지 않고 Jakarta Persistence 엔터티 개체에 대해 작동합니다.

HQL 소개

HQL(Hibernate Query Language)은 SQL과 같이 강력한 쿼리 언어입니다. 그러나 SQL과 비교할 때 HQL은 완전히 객체 지향적이며 상속, 다형성 및 연관과 같은 개념을 이해합니다.

HQL은 Jakarta Persistence 쿼리 언어의 상위 집합입니다. HQL 쿼리는 항상 유효한 Jakarta Persistence 쿼리 언어 쿼리인 것이 아니지만 Jakarta Persistence 쿼리 언어 쿼리는 항상 유효한 HQL 쿼리입니다.

HQL 및 Jakarta Persistence 쿼리 언어는 쿼리 작업을 수행하는 비유형 보안 방법입니다. 기준 쿼리는 쿼리에 안전한 타입의 접근 방식을 제공합니다.

4.2. HQL 문 정보

HQL 및 Jakarta Persistence 쿼리 언어는 모두 SELECT,UPDATE, DELETE 문을 허용합니다. HQL은 SQL INSERT -SELECT와 유사한 형태로 INSERT 문을 추가로 허용합니다.

다음 표는 다양한 HQL 문에 대한 BNF(Backus-Naur Form) 표기법의 구문을 보여줍니다.

Expand
표 4.1. HQL 문
내용 설명

SELECT

HQL의 SELECT 문에 대한 BNF는 다음과 같습니다.

select_statement :: =
        [select_clause]
        from_clause
        [where_clause]
        [groupby_clause]
        [having_clause]
        [orderby_clause]

UPDATE

HQL의 UPDATE 문은 Jakarta Persistence 쿼리 언어와 동일합니다.

update_statement ::= update_clause [where_clause]

update_clause ::= UPDATE entity_name [[AS] identification_variable]
        SET update_item {, update_item}*

update_item ::= [identification_variable.]{state_field | single_valued_object_field}
        = new_value

new_value ::= scalar_expression |
                simple_entity_expression |
                NULL

DELETE

HQL의 DELETE 문에 대한 BNF는 자카르타 지속성 쿼리 언어와 동일합니다.

delete_statement ::= delete_clause [where_clause]

delete_clause ::= DELETE FROM entity_name [[AS] identification_variable]

삽입

HQL의 BNF for INSERT 문은 다음과 같습니다.

insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*

여기에 해당하는 Jakarta Persistence 쿼리 언어는 없습니다.

주의

Hibernate를 사용하면 DML(Data Manipulation Language)을 사용하여 HQL(Hibernate Query Language)을 통해 매핑된 데이터베이스에서 직접 데이터를 대량 삽입, 업데이트 및 삭제할 수 있습니다.

DML을 사용하면 객체/관계 매핑을 위반할 수 있으며 개체 상태에 영향을 줄 수 있습니다. 오브젝트 상태는 메모리에 남아 있으며 DML을 사용하면 기본 데이터베이스에서 수행되는 작업에 따라 메모리 내 오브젝트의 상태에 영향을 미치지 않습니다. DML을 사용하는 경우 메모리 내 데이터를 주의해서 사용해야 합니다.

UPDATE 및 DELETE 문 정보

UPDATEDELETE 문에 대한 의사syntax는 다음과 같습니다.

(업데이트 | 삭제 )에서? EntityName (WHERE where_conditions)?.

참고

FROM 키워드 및 WHERE 절은 선택 사항입니다. FROM 절은 나머지 쿼리에 사용할 수 있는 오브젝트 모델 유형의 범위를 정의합니다. 또한 나머지 쿼리에서 사용할 수 있는 모든 식별 변수를 정의합니다. WHERE 절을 사용하면 반환된 인스턴스 목록을 구체화할 수 있습니다.

UPDATE 또는 DELETE 문을 실행한 결과는 실제로 영향을 받는 행 수입니다(업데이트 또는 삭제됨).

예제: 대량 업데이트 명령

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Company set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

예제: 대량 삭제 구문

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlDelete = "delete Company where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

Query.executeUpdate() 메서드에서 반환한 int 값은 작업에서 영향을 받은 데이터베이스 내의 엔터티 수를 나타냅니다.

내부적으로 데이터베이스는 여러 SQL 문을 사용하여 DML Update 또는 Delete 요청에 따라 작업을 실행할 수 있습니다. 이는 테이블과 업데이트 또는 삭제해야 하는 조인 테이블 사이에 존재하는 관계 때문일 수 있습니다.

예를 들어 위의 예와 같이 delete 문을 실행하면 oldName 으로 이름이 지정된 회사의 회사 테이블뿐만 아니라 조인 테이블에 대해서도 삭제가 실행될 수 있습니다. 따라서 이전 예제 성공적으로 실행된 결과, Employee 테이블과의 양방향, 다대다 관계의 회사 테이블도 해당 조인 테이블인 Company_Employee 에서 행이 손실됩니다.

deletedEntries 값에는 조인 테이블의 행을 포함하여 이 작업으로 인해 영향을 받는 모든 행의 수가 포함됩니다.

중요

활성 지속성 컨텍스트에서 데이터베이스와 엔터티 간에 불일치가 발생할 수 있으므로 대규모 업데이트 또는 삭제 작업을 실행할 때는 주의해야 합니다. 일반적으로 대규모 업데이트 및 삭제 작업은 새 지속성 컨텍스트의 트랜잭션 내에서 또는 해당 작업의 상태에 영향을 줄 수 있는 엔터티를 가져오거나 액세스하기 전에만 수행해야 합니다.

INSERT 문 정보

HQL은 INSERT 문을 정의할 수 있는 기능을 추가합니다. 여기에 해당하는 Jakarta Persistence 쿼리 언어는 없습니다. HQL INSERT 문의 Backus-Naur Form (BNF)은 다음과 같습니다.

insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*

attribute_list 는 SQL INSERT 문의 열 사양과 유사합니다. 매핑된 상속과 관련된 엔터티의 경우 명명된 엔터티에 직접 정의된 속성만 attribute_list 에서 사용할 수 있습니다. 슈퍼 클래스 속성은 허용되지 않으며 하위 클래스 속성은 의미가 없습니다. 즉, INSERT 문은 본질적으로 무형식입니다.

주의

select_statement 는 유효한 HQL 선택 쿼리일 수 있으며 반환 유형이 삽입에서 예상되는 유형과 일치해야 한다는 점에 유의하십시오. 현재는 검사를 데이터베이스에 재귀하는 것이 아니라 쿼리 컴파일 중에 확인됩니다. 이로 인해 동일한 것과 반대되는 Hibernate 유형에 문제가 발생할 수 있습니다 . 예를 들어, 데이터베이스가 구분되지 않거나 변환을 처리할 수 없는 경우에도 org.hibernate.type.DateType 으로 매핑된 속성과 org.hibernate.type.TimestampType 으로 정의된 속성 간에 일치하지 않는 문제가 발생할 수 있습니다.

id 속성의 경우 insert 문은 두 가지 옵션을 제공합니다. attribute_list 에서 id 속성을 명시적으로 지정할 수 있습니다. 이 경우 해당 값이 해당 선택 표현식에서 가져오거나 생성된 값이 사용되는 경우 attribute_list 에서 생략할 수 있습니다. 이 후자의 옵션은 "데이터베이스에서"를 작동하는 id 생성기를 사용하는 경우에만 사용할 수 있습니다. 이 옵션을 "메모리" 유형 생성기와 함께 사용하면 구문 분석 중에 예외가 발생합니다.

최적화된 잠금 속성의 경우 삽입 문은 다시 두 가지 옵션을 제공합니다. 해당 선택 표현식에서 값을 가져오는 경우 attribute_list 의 속성을 지정하거나 attribute_list 에서 생략할 수 있습니다. 이 경우 해당 org.hibernate.type.VersionType 에 의해 정의된 시드 값이 사용됩니다.

예제: INSERT 쿼리 설명

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery(hqlInsert).executeUpdate();

예제: 대량 삽입문

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlInsert = "insert into Account (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery( hqlInsert )
        .executeUpdate();
tx.commit();
session.close();

SELECT 문을 사용하여 id 속성 값을 제공하지 않으면 기본 데이터베이스에서 자동 생성된 키를 지원하는 한 식별자가 생성됩니다. 이 대규모 삽입 작업의 반환 값은 데이터베이스에 실제로 생성된 항목 수입니다.

4.3. HQL 주문 정보

쿼리 결과도 주문할 수 있습니다. ORDER BY 절은 결과를 주문하는 데 사용할 선택한 값을 지정하는 데 사용됩니다. order-by 절의 일부로 유효한 것으로 간주되는 식 유형은 다음과 같습니다.

  • 상태 필드
  • 구성 요소/임베드 가능 특성
  • 산술 연산, 함수 등과 같은 스칼라 표현식.
  • 이전 표현식 유형의 select 절에 선언된 ID 변수

HQL은 order-by 절에서 참조하는 모든 값을 select 절에 지정해야 하지만 Jakarta Persistence 쿼리 언어에 필요합니다. 데이터베이스 이식성을 지연하는 애플리케이션은 select 절에서 참조하지 않는 order-by 절에서 값을 참조하는 것을 일부 데이터베이스에서 지원하지는 않는다는 점을 알고 있어야 합니다.

주문에 포함된 개별 표현식을 ASC (가져오기) 또는 DESC (내림차순)와 함께 사용하여 원하는 순서 방향을 나타낼 수 있습니다.

예제: 주문 기준

// legal because p.name is implicitly part of p
select p
from Person p
order by p.name

select c.id, sum( o.total ) as t
from Order o
    inner join o.customer c
group by c.id
order by t

4.4. 컬렉션 멤버 레퍼런스 정보

컬렉션 값 연결에 대한 참조는 실제로 해당 컬렉션의 값을 나타냅니다.

예제: 수집 참조

select c
from Customer c
    join c.orders o
    join o.lineItems l
    join l.product p
where o.status = 'pending'
  and p.status = 'backorder'

// alternate syntax
select c
from Customer c,
    in(c.orders) o,
    in(o.lineItems) l
    join l.product p
where o.status = 'pending'
  and p.status = 'backorder'

이 예제에서 식별 변수 o 는 실제로 Customer#orders 연관 요소의 유형인 개체 모델 유형 Order를 나타냅니다.

예제에서는 IN 구문을 사용하여 컬렉션 연관 조인을 지정하는 대체 구문도 보여줍니다. 두 형식 모두 동일합니다. 애플리케이션이 사용하기 위해 선택하는 양식은 단순히 맛보기 때문일 뿐입니다.

4.5. 정규화된 경로 표현식 정보

이전에 수집 가치 있는 연관이 해당 컬렉션의 값을 참조한다고 설명되었습니다. 컬렉션 유형에 따라 명시적 자격 표현식 집합도 사용할 수 있습니다.

Expand
표 4.2. 유효한 경로 표현식
표현식설명

collection 값을 참조합니다. 한정자를 지정하지 않는 것과 동일합니다. 의도를 명시적으로 표시하는 데 유용합니다. 모든 유형의 컬렉션 값 참조에 유효합니다.

인덱스

HQL 규칙에 따라 javax.persistence.OrderColumn 주석을 지정하는 Maps 및 List 둘 다에서 유효하여 Map 키 또는 List 위치( OrderColumn 값이라고 함)를 참조합니다. 그러나 Jakarta Persistence 쿼리 언어는 목록 사례에서 사용할 수 있도록 예약하고 MAP 사례에 대해 KEY 를 추가합니다. 자카르타 지속성 공급자 이식성에 관심이 있는 애플리케이션은 이러한 차이점을 알고 있어야 합니다.

KEY

맵에만 유효합니다. 맵의 키를 나타냅니다. 키가 엔터티인 경우 를 추가로 탐색할 수 있습니다.

항목

맵에만 유효합니다. 맵의 논리적 java.util.Map.Entry authenticateple(키와 값의 조합)을 나타냅니다. ENTRY 는 터미널 경로로만 유효하며 select 절에만 유효합니다.

예제: 정규화된 컬렉션 참조

// Product.images is a Map<String,String> : key = a name, value = file path

// select all the image file paths (the map value) for Product#123
select i
from Product p
    join p.images i
where p.id = 123

// same as above
select value(i)
from Product p
    join p.images i
where p.id = 123

// select all the image names (the map key) for Product#123
select key(i)
from Product p
    join p.images i
where p.id = 123

// select all the image names and file paths (the 'Map.Entry') for Product#123
select entry(i)
from Product p
    join p.images i
where p.id = 123

// total the value of the initial line items for all orders for a customer
select sum( li.amount )
from Customer c
        join c.orders o
        join o.lineItems li
where c.id = 123
  and index(li) = 1

4.6. HQL 기능 정보

HQL은 사용 중인 기본 데이터베이스와 관계없이 사용할 수 있는 몇 가지 표준 기능을 정의합니다. HQL은 전화 번호 및 애플리케이션에 정의된 추가 기능도 이해할 수 있습니다.

4.6.1. HQL Standardized Functions 정보

사용 중인 기본 데이터베이스와 관계없이 HQL에서 다음 기능을 사용할 수 있습니다.

Expand
표 4.3. HQL 표준 기능
함수설명

BIT_LENGTH

바이너리 데이터의 길이를 반환합니다.

CAST

SQL 플러시 수행. 드리프트 대상은 사용할 Hibernate 매핑 유형의 이름을 지정해야 합니다.

EXTRACT

datetime 값에 SQL 압축을 수행합니다. 추출 날짜/시간 값의 일부를 반환합니다(예: 연도). 아래에서 축약된 양식을 참조하십시오.

SECOND

두 번째 추출을 위한 축약된 추출 양식.

분 추출을 위한 약어 추출 양식.

HOUR

시간을 추출하기 위한 약어 추출 양식.

DAY

오늘의 추출을 위한 약어 추출 양식.

월 추출을 위한 약어 추출 양식.

연도 추출을 위한 약어 추출 양식.

STR

문자 데이터로 값을 나타내는 약어 형식입니다.

4.6.2. HQL 비표준 함수 정보

Hibernate callects는 특정 데이터베이스 제품에 사용할 수 있는 것으로 알려진 추가 기능을 등록할 수 있습니다. 데이터베이스를 사용하거나 전화하는 경우에만 사용할 수 있습니다. 데이터베이스 이식성을 목표로 하는 애플리케이션은 이 카테고리의 기능을 사용하지 않아야 합니다.

애플리케이션 개발자는 자체 기능 세트도 제공할 수 있습니다. 일반적으로 SQL 코드 조각에 대한 사용자 지정 SQL 함수 또는 별칭을 나타냅니다. 이러한 기능 선언은 org.hibernate.cfg.Configuration의 addSqlœction 방법을 사용하여 수행됩니다.

4.6.3. 연결 작업 정보

HQL은 연결(ConCAT) 기능을 지원하는 것 외에도 연결 연산자를 정의합니다. 이는 Jakarta Persistence 쿼리 언어에 의해 정의되지 않으므로 이식 가능한 애플리케이션은 사용하지 않아야 합니다. 연결 운영자는 SQL 연결 연산자(||)에서 가져옵니다.

예제: 연결 작업 예

select 'Mr. ' || c.name.first || ' ' || c.name.last
from Customer c
where c.gender = Gender.MALE

4.7. 동적 인스턴스화 정보

select 절에만 유효한 특정 표현식 유형이 있습니다. Hibernate를 이 "동적 인스턴스화"라고 합니다. Jakarta Persistence 쿼리 언어는 이 기능 중 일부를 지원하고 "건설자 표현식"이라고 합니다.

예제: 동적 인스턴스화 예 - 빌드자

select new Family( mother, mate, offspr )
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr

따라서 여기에서 Object[]를 처리하는 대신 쿼리 결과로 반환될 타입의 안전한 Java 오브젝트의 값을 래핑합니다. 클래스 참조는 정규화되어야 하며 일치하는 생성자가 있어야 합니다.

여기에서는 클래스를 매핑할 필요가 없습니다. 엔터티를 나타내는 경우 결과 인스턴스가 NEW 상태로 반환됩니다(관리되지 않음).

이는 Jakarta Persistence 쿼리 언어도 지원합니다. HQL은 추가 "동적 인스턴스화" 기능을 지원합니다. 먼저 쿼리는 스칼라 결과에 대한 Object[] 대신 List를 반환하도록 지정할 수 있습니다.

예제: 동적 인스턴스화 예 - 목록

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

이 쿼리의 결과는 List<Object[]>와 달리 List<List>가 됩니다.

HQL은 스칼라 결과를 래핑하는 기능도 지원합니다.

예제: 동적 인스턴스화 예 - 맵

select new map( mother as mother, offspr as offspr, mate as mate )
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr

select new map( max(c.bodyWeight) as max, min(c.bodyWeight) as min, count(*) as n )
from Cat cxt

이 쿼리의 결과는 List<Object[]>와 달리 List<Map<String,Object✓이 됩니다. 맵의 키는 선택 표현식에 지정된 별칭으로 정의됩니다.

4.8. HQL 서술자 정보

서술자는 where 절, have 절, 검색된 대소문자 표현식의 기반을 형성합니다. NULL 값을 포함하는 부울 비교는 일반적으로 TRUE 또는 FALSE 로 해석되지만 일반적으로 TRUE 또는 FALSE로 해석되는 표현식 입니다.

HQL 서술자
  • null 서술자

    null 값을 확인합니다. 기본 속성 참조, 엔터티 참조 및 매개 변수에 적용할 수 있습니다. HQL을 사용하면 구성 요소/embeddable 유형에 적용할 수 있습니다.

    예제: Null 확인

    // select everyone with an associated address
    select p
    from Person p
    where p.address is not null
    
    // select everyone without an associated address
    select p
    from Person p
      where p.address is null

  • 서술자처럼

    문자열 값에 대해 유사한 비교 수행. 구문은 다음과 같습니다.

    like_expression ::=
           string_expression
           [NOT] LIKE pattern_value
           [ESCAPE escape_character]

    의미 체계는 표현식과 같은 SQL의 내용을 따릅니다. pattern_valuestring_ expressionion에서 일치시킬 패턴입니다. SQL과 마찬가지로 pattern_value_ (underscore) 및 % (percent)를 와일드카드로 사용할 수 있습니다. 의미는 동일합니다. 단일 문자 와 일치 (_) % 는 임의 수의 문자와 일치합니다.

    선택 사항인 escape_characterpattern_value 에서 특수한 의미를 _% 로 이스케이프하는 데 사용되는 이스케이프 문자를 지정하는 데 사용됩니다. 이는 _ 또는 % 를 포함한 패턴을 검색해야 할 때 유용합니다.

    예제: LIKE 서술자

    select p
    from Person p
    where p.name like '%Schmidt'
    
    select p
    from Person p
    where p.name not like 'Jingleheimmer%'
    
    // find any with name starting with "sp_"
    select sp
    from StoredProcedureMetadata sp
    where sp.name like 'sp|_%' escape '|'

  • 서술자 사이

    SQLWEEN 표현식 유사합니다. 값이 다른 2개 값 범위 내에 있는 평가를 수행합니다. 모든 피연산자가 비슷한 유형을 가져야 합니다.

    예제: 수요일 서술자

    select p
    from Customer c
        join c.paymentHistory p
    where c.id = 123
      and index(p) between 0 and 9
    
    select c
    from Customer c
    where c.president.dateOfBirth
            between {d '1945-01-01'}
                and {d '1965-01-01'}
    
    select o
    from Order o
    where o.total between 500 and 5000
    
    select p
    from Person p
    where p.name between 'A' and 'E'

  • 서술자

    IN 서술자는 특정 값이 값 목록에 있는지 확인합니다. 구문은 다음과 같습니다.

    in_expression ::= single_valued_expression
                [NOT] IN single_valued_list
    
    single_valued_list ::= constructor_expression |
                (subquery) |
                collection_valued_input_parameter
    
    constructor_expression ::= (expression[, expression]*)

    single_valued_expression 의 유형과 single_ valued_list 의 개별 값이 일관되어야 합니다. Jakarta Persistence 쿼리 언어는 여기에서 유효한 유형을 문자열, 숫자, 날짜, 시간, 타임스탬프 및 열거 유형으로 제한합니다. 자카르타 지속성 쿼리 언어 에서는 single_valued_expression 은 다음을 참조할 수 있습니다.

    • 단순 속성의 용어인 "상태 필드". 특히, 연결 및 구성 요소/임베디드 속성이 제외됩니다.
    • 엔터티 유형 표현식.

      HQL에서 single_valued_expression 은 훨씬 광범위한 표현식 유형을 참조할 수 있습니다. 단일 값 연결은 허용됩니다. 이러한 기능은 기본 데이터베이스에서 "로열 값 생성자 구문"에 대한 지원 수준에 따라 달라지지만 구성 요소/임베디드 속성입니다. 또한 HQL은 어떤 방식으로도 값 유형을 제한하지 않지만, 애플리케이션 개발자는 다양한 유형의 경우 기본 데이터베이스 벤더에 따라 제한된 지원이 발생할 수 있다는 점을 알고 있어야 합니다. 이는 주로 Jakarta Persistence 쿼리 언어 제한의 이유입니다.

      값 목록은 다양한 소스에서 가져올 수 있습니다. constructor_Expression 및 collection_valued_input_parameter 에서는 값 목록이 비어 있으면 안 됩니다. 값은 하나 이상 포함되어야 합니다.

      예제: 서술자

      select p
      from Payment p
      where type(p) in (CreditCardPayment, WireTransferPayment)
      
      select c
      from Customer c
      where c.hqAddress.state in ('TX', 'OK', 'LA', 'NM')
      
      select c
      from Customer c
      where c.hqAddress.state in ?
      
      select c
      from Customer c
      where c.hqAddress.state in (
          select dm.state
          from DeliveryMetadata dm
          where dm.salesTax is not null
      )
      
      // Not Jakarta Persistence query language compliant!
      select c
      from Customer c
      where c.name in (
          ('John','Doe'),
          ('Jane','Doe')
      )
      
      // Not Jakarta Persistence query language compliant!
      select c
      from Customer c
      where c.chiefExecutive in (
          select p
          from Person p
          where ...
      )

4.9. 관계형 비교 정보

비교에는 =, >, >=, <, KEY, <>와 같은 비교 연산자 중 하나가 포함됩니다. HQL은 또한 <>과 동의한 비교 연산자로 !=를 정의합니다. 피연산자는 동일한 유형이어야 합니다.

예제: 관계 비교 예

// numeric comparison
select c
from Customer c
where c.chiefExecutive.age < 30

// string comparison
select c
from Customer c
where c.name = 'Acme'

// datetime comparison
select c
from Customer c
where c.inceptionDate < {d '2000-01-01'}

// enum comparison
select c
from Customer c
where c.chiefExecutive.gender = com.acme.Gender.MALE

// boolean comparison
select c
from Customer c
where c.sendEmail = true

// entity type comparison
select p
from Payment p
where type(p) = WireTransferPayment

// entity value comparison
select c
from Customer c
where c.chiefExecutive = c.chiefTechnologist

비교에는 하위 쿼리 한정자 - ALL,ANY,SOME 도 포함될 수 있습니다. SOMEANY 는 동의어입니다.

하위 쿼리 결과에 있는 모든 값에 대해 비교가 참이면 ALL 한정자가 true로 확인됩니다. 하위 쿼리 결과가 비어 있으면 false로 확인됩니다.

예제: 모든 하위 쿼리 비교 예

// select all players that scored at least 3 points
// in every game.
select p
from Player p
where 3 > all (
   select spg.points
   from StatsPerGame spg
   where spg.player = p
)

하위 쿼리 결과로 값 중 하나 이상에 대해 비교가 참이면 ANY/SOME 한정자가 true로 확인됩니다. 하위 쿼리 결과가 비어 있으면 false로 확인됩니다.

4.10. 바이트 코드 개선 사항

바이트 코드 개선은 지속성 관련 기능 추가와 같은 특정 목적을 위해 클래스의 바이트 코드(.class) 표현을 조작하는 데 사용됩니다. JBoss EAP 인스턴스의 경우 런타임 시 바이트 코드 개선 사항을 수행할 수 있습니다.

중요

빌드 시간 바이트 코드 개선은 JBoss EAP에서 지원 및 테스트되지 않습니다.

도메인 모델의 런타임 개선은 클래스 변환 수행에 JPA-defined Service Provider Interface(SPI)를 사용하므로 관리형 JPA 환경에서만 지원됩니다. 런타임 개선 사항은 기본적으로 비활성화되어 있습니다.

런타임 기능 향상을 활성화하려면 요구 사항에 따라 영구 장치에서 다음 속성 중 하나 이상의 값을 설정합니다.

  • enableLazyInitialization: lazy 특성 로드가 필요한 경우 이 속성을 활성화합니다.
  • enableDirtyTracking: 자체 디렉터리 추적을 위해 개선이 필요한 경우 이 속성을 활성화합니다.
  • enableAssociationManagement: 양방향 연결 관리가 필요한 경우 이 속성을 활성화합니다.

예제: 런타임 개선 기능을 사용하도록 속성 설정

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="Example">
        ...
        <properties>
            <property name="hibernate.enhancer.enableLazyInitialization" value="true" />
            <property name="hibernate.enhancer.enableDirtyTracking" value="true" />
            <property name="hibernate.enhancer.enableAssociationManagement" value="true" />
             ...
        </properties>
    </persistence-unit>
</persistence>

참고

런타임 기능 개선을 위해 주석이 지정된 클래스만 지원됩니다. 즉, 영구 유닛에 선언된 클래스만 향상됩니다.

4.10.1. 지연된 속성 로드

지연 속성 로드는 Hibernate에 데이터베이스에서 가져올 때 엔터티의 특정 부분만 로드해야 하고 나머지 부분도 로드해야 할 시기를 Hibernate에 알릴 수 있는 바이트 코드 개선 사항입니다. 이는 필요에 따라 엔터티 상태가 한 번에 로드되는 엔터티 중심인 지연 로드의 프록시 기반 아이디어와 다릅니다. 바이트코드 기능 향상을 통해 필요에 따라 개별 속성 또는 속성 그룹이 로드됩니다.

지연 속성은 함께 로드하도록 지정할 수 있으며 이를 지연 그룹 이라고 합니다. 기본적으로 모든 단수 속성은 단일 그룹의 일부입니다. 하나의 지연 단일 단수 속성에 액세스하면 모든 지연 단수 속성이 로드됩니다. 지연 단일 그룹과는 달리, lazy plural 속성은 각각 개별 지연 그룹입니다. 이 동작은 @org.hibernate.annotations.LazyGroup 주석을 통해 명시적으로 제어할 수 있습니다.

@Entity
public class Customer {

    @Id
    private Integer id;

    private String name;

    @Basic( fetch = FetchType.LAZY )
    private UUID accountsPayableXrefId;

    @Lob
    @Basic( fetch = FetchType.LAZY )
    @LazyGroup( "lobs" )
    private Blob image;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public UUID getAccountsPayableXrefId() {
        return accountsPayableXrefId;
    }

    public void setAccountsPayableXrefId(UUID accountsPayableXrefId) {
        this.accountsPayableXrefId = accountsPayableXrefId;
    }

    public Blob getImage() {
        return image;
    }

    public void setImage(Blob image) {
        this.image = image;
    }
}

위의 예에는 accountsPayableXrefIdimage 라는 두 개의 지연 속성이 있습니다. 이러한 각 특성은 다른 가져오기 그룹의 일부입니다. accountsPayableXrefId 속성은 기본 가져오기 그룹의 일부입니다. 즉 accountsPayableXrefId 에 액세스하는 경우 이미지 특성을 강제로 로드하지 않으며 그 반대의 경우도 마찬가지입니다.

4.10.2. 인라인 더티 추적

Hibernate는 지속성 컨텍스트에서 변경된 엔터티를 결정하기 위해 차이점 기반 추적 계산을 지원합니다. 즉, Hibernate는 엔티티의 마지막 알려진 상태에 대해 엔티티의 현재 상태를 확인하여 변경 사항을 추적할 수 있음을 의미합니다.

인라인 더티 추적 기능은 상태 밀도 계산을 수행하지 않고 내부 상태를 변경할 수 있는 데이터 유형을 추적하는 데 유용합니다. Hibernate는 클래스의 바이트 코드를 조작하여 더티 추적 기능을 엔터티에 직접 추가하기 때문에 엔티티가 변경된 특성을 추적할 수 있습니다.

4.10.3. BI-directal 연결 관리

Hibernate는 Java 언어의 규칙에 가까운 애플리케이션을 개발하는 데 도움이 됩니다.

다음 예제에서는 잘못된 Java 사용법을 보여줍니다.

예제: 잘못된 Java 사용

Order order = new Order();
LineItem lineItem = new LineItem();
order.getLineItems().add( lineItem );

// This blows up (NPE) in normal Java usage
lineItem.getOrder.getname();

다음 예제에서는 올바른 Java 사용법을 보여줍니다.

예제: 올바른 Java 사용

Order order = new Order();
LineItem lineItem = new LineItem();
order.getLineItems().add( lineItem );
lineItem.setOrder( order );

// Now this is OK...
lineItem.getOrder.getname();

양방향 연관 관리 기능을 사용하면 한 측이 조작될 때 양방향 연관의 다른 측면이 작동할 수 있습니다.

5장. Hibernate 서비스

5.1. Hibernate 서비스 정보

서비스는 Hibernate에 다양한 유형의 기능의 플러그형 구현을 제공하는 클래스입니다. 특히 특정 서비스 계약 인터페이스의 구현입니다. 인터페이스를 서비스 역할이라고 합니다. 구현 클래스를 서비스 구현이라고 합니다. 일반적으로 사용자는 모든 표준 서비스 역할(덮어쓰기)의 대체 구현을 연결할 수 있습니다. 또한 기본 서비스 역할 집합(확장)을 넘어 추가 서비스를 정의할 수도 있습니다.

5.2. 서비스 계약 정보

서비스의 기본 요구 사항은 마커 인터페이스 org.hibernate.service.Service를 구현하는 것입니다. Hibernate는 일부 기본 유형 안전에 이를 내부적으로 사용합니다.

선택적으로 서비스는 org.hibernate.service.spi.Startable 및 org.hibernate.service.spi.Stoppable 인터페이스를 구현하여 시작 및 중지됨 알림을 받을 수 있습니다. 또 다른 옵션 서비스 계약은 org.hibernate.service.spi.Manageable으로, Jakarta Management 통합이 활성화되면 Jakarta Management에서 서비스를 관리 가능으로 표시합니다.

5.3. 서비스 종속성 유형

서비스는 다음 접근 방법 중 하나를 사용하여 다른 서비스에 대한 종속성을 선언할 수 있습니다.

@org.hibernate.service.spi.InjectService

단일 매개 변수를 수락하고 @InjectService 주석을 달 수 있는 서비스 구현 클래스의 모든 메서드는 다른 서비스의 주입을 요청하는 것으로 간주됩니다.

기본적으로 메서드 매개 변수의 유형은 삽입할 서비스 역할이어야 합니다. 매개 변수 유형이 서비스 역할과 다른 경우 InjectServiceserviceRole 특성을 사용하여 역할의 이름을 명시적으로 지정해야 합니다.

기본적으로 삽입된 서비스는 필요한 것으로 간주되며, 이는 명명된 종속 서비스가 누락된 경우 시작에 실패하는 것입니다. 주입할 서비스가 선택 사항인 경우 InjectService 의 필수 특성을 false 로 선언해야 합니다. 기본값은 true입니다.

org.hibernate.service.spi.ServiceRegistryAwareService

두 번째 방법은 서비스에서 단일 injectServices 메서드를 선언하는 선택적 서비스 인터페이스 org.hibernate.service.spi.ServiceRegistryAwareService 를 구현하는 가져오기 접근법입니다.

시작하는 동안 Hibernate는 이 인터페이스를 구현하는 서비스에 org.hibernate.service.ServiceRegistry 자체를 주입합니다. 그런 다음 서비스는 ServiceRegistry 참조를 사용하여 필요한 추가 서비스를 찾을 수 있습니다.

5.3.1. 서비스 레지스트리

5.3.1.1. ServiceRegistry 정보

서비스 자체 외에도 중앙 서비스 API는 org.hibernate.service.ServiceRegistry 인터페이스입니다. 서비스 레지스트리의 주요 목적은 서비스에 대한 액세스를 보유, 관리 및 제공하는 것입니다.

서비스 레지스트리는 계층 구조입니다. 한 레지스트리의 서비스는 해당 레지스트리와 상위 레지스트리의 서비스를 활용하고 활용할 수 있습니다.

org.hibernate.service.ServiceRegistryBuilder를 사용하여 org.hibernate.service.ServiceRegistry 인스턴스를 빌드합니다.

ServiceRegistryBuilder를 사용하여 ServiceRegistry 생성 예

ServiceRegistryBuilder registryBuilder =
    new ServiceRegistryBuilder( bootstrapServiceRegistry );
    ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();

5.3.2. 사용자 정의 서비스

5.3.2.1. 사용자 지정 서비스 정보

org.hibernate.service.ServiceRegistry 가 구축되면 변경 불가능한 것으로 간주됩니다. 서비스 자체에서 재구성을 수락할 수 있지만, 여기에서 불변성은 서비스 추가 또는 교체를 의미합니다. 따라서 org.hibernate.service.ServiceRegistryBuilder 에서 제공하는 또 다른 역할은 생성된 org.hibernate.service.ServiceRegistry 에 포함될 서비스를 수정할 수 있습니다.

org.hibernate.service.ServiceRegistryBuilder 에 사용자 지정 서비스에 대해 알리는 두 가지 방법이 있습니다.

  • org.hibernate.service.spi.BasicServiceInitiator 클래스를 구현하여 서비스 클래스의 온디맨드 구성을 제어하고 addInitiator 메서드를 사용하여 org.hibernate.service.ServiceRegistryBuilder 에 추가합니다.
  • 서비스 클래스를 인스턴스화하고 addService 메서드를 사용하여 org.hibernate.service.ServiceRegistryBuilder 에 추가합니다.

두 방법 중 하나는 새 서비스 역할 추가 등의 레지스트리 확장 및 서비스 구현 대체와 같은 서비스 재정의에 유효합니다.

예제: ServiceRegistryBuilder를 사용하여 기존 서비스를 사용자 지정 서비스로 교체

ServiceRegistryBuilder registryBuilder =
    new ServiceRegistryBuilder(bootstrapServiceRegistry);
registryBuilder.addService(JdbcServices.class, new MyCustomJdbcService());
ServiceRegistry serviceRegistry = registryBuilder.buildServiceRegistry();

public class MyCustomJdbcService implements JdbcServices{

   @Override
   public ConnectionProvider getConnectionProvider() {
       return null;
   }

   @Override
   public Dialect getDialect() {
       return null;
   }

   @Override
   public SqlStatementLogger getSqlStatementLogger() {
       return null;
   }

   @Override
   public SqlExceptionHelper getSqlExceptionHelper() {
       return null;
   }

   @Override
   public ExtractedDatabaseMetaData getExtractedMetaDataSupport() {
       return null;
   }

   @Override
   public LobCreator getLobCreator(LobCreationContext lobCreationContext) {
       return null;
   }

   @Override
   public ResultSetWrapper getResultSetWrapper() {
       return null;
   }
}

5.3.3. Boot-Strap 레지스트리

5.3.3.1. 부트스트랩 레지스트리 정보

boot-strap 레지스트리에는 대부분의 작업이 작동하려면 반드시 사용할 수 있는 서비스가 있습니다. 여기에 있는 주요 서비스는 완벽한 예인 ClassLoaderService 입니다. 구성 파일을 해결하더라도 리소스 조회 등 클래스 로드 서비스에 액세스할 수 있어야 합니다. 이는 일반적으로 상위 레지스트리가 아닌 루트 레지스트리입니다.

boot-strap 레지스트리 인스턴스는 org.hibernate.service.BootstrapServiceRegistryBuilder 클래스를 사용하여 빌드됩니다.

Using BootstrapServiceRegistryBuilder

예제: Using BootstrapServiceRegistryBuilder

BootstrapServiceRegistry bootstrapServiceRegistry =
    new BootstrapServiceRegistryBuilder()
    // pass in org.hibernate.integrator.spi.Integrator instances which are not
    // auto-discovered (for whatever reason) but which should be included
    .with(anExplicitIntegrator)
    // pass in a class loader that Hibernate should use to load application classes
    .with(anExplicitClassLoaderForApplicationClasses)
    // pass in a class loader that Hibernate should use to load resources
    .with(anExplicitClassLoaderForResources)
    // see BootstrapServiceRegistryBuilder for rest of available methods
    ...
    // finally, build the bootstrap registry with all the above options
    .build();

5.3.3.2. BootstrapRegistry Services
org.hibernate.service.classloading.spi.ClassLoaderService

Hibernate는 클래스 로더와 상호 작용해야 합니다. 그러나 Hibernate 또는 모든 라이브러리에서 클래스 로더와 상호 작용하는 방식은 애플리케이션을 호스팅하는 런타임 환경에 따라 달라집니다. 애플리케이션 서버, OSGi 컨테이너 및 기타 모듈식 클래스 로드 시스템은 매우 구체적인 클래스 로드 요구 사항을 적용합니다. 이 서비스는 Hibernate에 환경 복잡성을 추상화하는 기능을 제공합니다. 그리고 중요한 사실은 하나의 구성 요소로 이루어집니다.

클래스 로더와 상호 작용하는 경우 Hibernate에는 다음과 같은 기능이 필요합니다.

  • 애플리케이션 클래스를 찾을 수 있는 기능
  • 통합 클래스를 찾을 수 있는 기능
  • 속성 파일 및 XML 파일과 같은 리소스를 찾는 기능
  • java.util.ServiceLoader로드 기능

    참고

    현재 애플리케이션 클래스를 로드하고 통합 클래스를 로드하는 기능이 서비스의 단일 부하 클래스 기능으로 결합되어 있습니다. 이후 릴리스에서 변경될 수 있습니다.

org.hibernate.integrator.spi.IntegratorService

애플리케이션, 애드온 및 기타 모듈은 Hibernate와 통합되어야 합니다. 이전 접근 방식에는 각 개별 모듈의 등록을 조정하기 위해 구성 요소(일반적으로 애플리케이션이 필요했습니다. 이 등록은 각 모듈의 통합자를 대신하여 수행되었습니다.

이 서비스는 검색 측면에 중점을 둡니다. org.hibernate.service .classloading.spi.ClassLoaderService에서 제공하는 표준 java.util.ServiceLoader 기능을 활용하여 org.hibernate.integrator.spi.Integrator 계약의 구현을 검색합니다.

통합자는 /META-INF/services/org.hibernate.integrator.spi.Integrator 라는 파일을 정의하고 클래스 경로에서 사용할 수 있도록 합니다.

이 파일은 java.util.ServiceLoader 메커니즘에서 사용합니다. 행당 하나씩 org.hibernate.integrator.spi.Integrator 인터페이스를 구현하는 정규화된 클래스를 나열합니다.

5.3.4. 세션팩트 레지스트리

모든 레지스트리 유형의 인스턴스를 지정된 org.hibernate.SessionFactory 를 대상으로 처리하는 것이 좋지만 이 그룹의 서비스 인스턴스는 단일 org.hibernate.SessionFactory 에 명시적으로 속합니다.

차이점은 시작되어야 하는 시기의 문제에 해당합니다. 일반적으로 시작하려면 org.hibernate.SessionFactory 에 액세스할 수 있어야 합니다. 이 특수 레지스트리는 org.hibernate.service.spi.SessionFactoryServiceRegistry 입니다.

5.3.4.1. SessionFactory 서비스

org.hibernate.event.service.spi.EventListenerRegistry

설명
이벤트 리스너를 관리하는 서비스입니다.
개시자
org.hibernate.event.service.internal.EventListenerServiceInitiator
구현
org.hibernate.event.service.internal.EventListenerRegistryImpl

5.3.5. 통합업체

org.hibernate.integrator.spi.Integrator 는 개발자가 작동하는 SessionFactory 를 구축하는 프로세스에 후크할 수 있는 간단한 방법을 제공하기 위한 것입니다. org.hibernate.integrator.spi.Integrator 인터페이스는 두 가지 관심 방법을 정의합니다.

  • 통합을 통해 구축 프로세스로 전환할 수 있습니다.
  • 해체 하면 SessionFactory 종료를 시작할 수 있습니다.
참고

과부하 형태인 org.hibernate.integrator.spi.Integrator 에 정의된 세 번째 방법은 org.hibernate.metamodel.source.MetadataImplementor 대신 org.hibernate.cfg.Configuration을 수락합니다.

IntegratorService에서 제공하는 검색 접근 방식 외에도 애플리케이션은 BootstrapService Registry 를 빌드할 때 Integrator 구현을 수동으로 등록할 수 있습니다.

5.3.5.1. 통합업체 사용 사례

org.hibernate.integrator.spi.Integrator 의 주요 사용 사례는 이벤트 리스너를 등록하고 서비스를 제공하고 org.hibernate.integrator.spi.ServiceContributingIntegrator 를 참조하십시오.

예제: 이벤트 리스너 등록

public class MyIntegrator implements org.hibernate.integrator.spi.Integrator {

    public void integrate(
            Configuration configuration,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
        // As you might expect, an EventListenerRegistry is the thing with which event listeners are registered  It is a
        // service so we look it up using the service registry
        final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);

        // If you wish to have custom determination and handling of "duplicate" listeners, you would have to add an
        // implementation of the org.hibernate.event.service.spi.DuplicationStrategy contract like this
        eventListenerRegistry.addDuplicationStrategy(myDuplicationStrategy);

        // EventListenerRegistry defines 3 ways to register listeners:
        //     1) This form overrides any existing registrations with
        eventListenerRegistry.setListeners(EventType.AUTO_FLUSH, myCompleteSetOfListeners);
        //     2) This form adds the specified listener(s) to the beginning of the listener chain
        eventListenerRegistry.prependListeners(EventType.AUTO_FLUSH, myListenersToBeCalledFirst);
        //     3) This form adds the specified listener(s) to the end of the listener chain
        eventListenerRegistry.appendListeners(EventType.AUTO_FLUSH, myListenersToBeCalledLast);
    }
}

6장. Hibernate Envers

6.1. Hibernate Envers 정보

Hibernate Envers는 감사 및 버전 관리 시스템으로, JBoss EAP에 지속적 클래스에 대한 이전 변경 사항을 추적할 수 있습니다. 감사 테이블은 엔터티에 대한 변경 기록을 저장하는 @Audited 로 주석이 지정된 엔터티에 대해 생성됩니다. 그런 다음 데이터를 검색하고 쿼리할 수 있습니다.

개발자는 Envers를 통해 다음을 수행할 수 있습니다.

  • Jakarta Persistence 사양에 정의된 모든 매핑 감사
  • Jakarta Persistence 사양을 확장하는 모든 hibernate 매핑 감사
  • 기본 Hibernate API를 사용하거나 사용하여 매핑된 감사 엔터티
  • 버전 엔터티를 사용하여 각 버전에 대한 로그 데이터
  • 기록 데이터 쿼리

6.2. 영구 클래스 감사 정보

지속 클래스 감사는 Hibernate Envers 및 @Audited 주석을 통해 JBoss EAP에서 수행됩니다. 주석이 클래스에 적용되면 엔터티의 버전 기록을 저장하는 테이블이 생성됩니다.

클래스를 변경할 때마다 audit 테이블에 항목이 추가됩니다. 항목에는 클래스의 변경 사항이 포함되어 있으며 버전 번호가 제공됩니다. 즉, 변경 사항을 롤백하거나 이전 버전을 볼 수 있습니다.

6.3. 감사 전략

6.3.1. 전략 감사 정보

감사 전략은 감사 정보를 유지, 쿼리 및 저장하는 방법을 정의합니다. 현재 Hibernate Envers에서는 다음 두 가지 감사 전략을 사용할 수 있습니다.

기본 감사 전략
  • 이 전략은 시작 버전과 함께 감사 데이터를 유지합니다. 감사된 테이블에서 삽입, 업데이트 또는 삭제되는 각 행의 유효성을 시작 리버전과 함께 감사 테이블에 하나 이상의 행이 삽입됩니다.
  • 감사 테이블의 행은 삽입 후 업데이트되지 않습니다. 감사 정보 쿼리는 하위 쿼리를 사용하여 느린 인덱스가 어렵고 감사 테이블에서 해당 행을 선택합니다.
유효 감사 전략
  • 이 전략에서는 시작 버전과 감사 정보의 최종 버전을 저장합니다. 감사된 테이블에서 삽입, 업데이트 또는 삭제되는 각 행의 유효성을 시작 리버전과 함께 감사 테이블에 하나 이상의 행이 삽입됩니다.
  • 동시에 이전 감사 행의 최종 버전 필드(사용 가능한 경우)가 이 버전으로 설정됩니다. 그러면 감사 정보에 대한 쿼리가 하위 쿼리 대신 start 및 end revision 간에 사용할 수 있습니다. 즉, 추가 업데이트로 인해 감사 정보를 유지하는 속도가 조금 더 느리지만 감사 정보를 검색하는 속도가 훨씬 빠릅니다.
  • 또한 추가 인덱스를 추가하여 개선할 수 있습니다.

감사에 대한 자세한 내용은 영구 클래스 감사 정보를 참조하십시오. 애플리케이션에 대한 감사 전략을 설정하려면 감사 전략 설정을 참조하십시오.

6.3.2. 감사 전략 설정

JBoss EAP에서는 다음 두 가지 감사 전략을 지원합니다.

  • 기본 감사 전략
  • 유효 감사 전략
감사 전략 정의

애플리케이션의 persistence .xml 파일에 org.hibernate.envers. audit_strategy 속성을 구성합니다. persistence.xml 파일에 속성이 설정되지 않은 경우 기본 감사 전략이 사용됩니다.

기본 감사 전략 설정

<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.DefaultAuditStrategy"/>

Validity 감사 전략 설정

<property name="org.hibernate.envers.audit_strategy" value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>

6.3.3. Jakarta Persistence 엔터티에 감사 지원 추가

절차

JBoss EAP는 Hibernate Envers 를 통한 엔터티 감사를 사용하여 지속 클래스의 이전 변경 사항을 추적합니다. 이 섹션에서는 자카르타 지속성 엔터티에 대한 감사 지원을 추가하는 방법에 대해 설명합니다.

Jakarta Persistence 엔터티에 감사 지원 추가

  1. 배포에 맞게 사용 가능한 감사 매개변수를 구성합니다. 자세한 내용은 Configure Envers Parameters 를 참조하십시오.
  2. 감사할 Jakarta Persistence 엔터티를 엽니다.
  3. org.hibernate.envers.Audited 인터페이스를 가져옵니다.
  4. 감사할 각 필드 또는 속성에 @Audited 주석을 적용하거나 전체 클래스에 한 번 적용합니다.

    예제: 두 필드 감사

    import org.hibernate.envers.Audited;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Column;
    
    @Entity
    public class Person {
        @Id
        @GeneratedValue
        private int id;
    
        @Audited
        private String name;
    
        private String surname;
    
        @ManyToOne
        @Audited
        private Address address;
    
        // add getters, setters, constructors, equals and hashCode here
    }

    예제: 전체 클래스 감사

    import org.hibernate.envers.Audited;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Column;
    
    @Entity
    @Audited
    public class Person {
        @Id
        @GeneratedValue
        private int id;
    
        private String name;
    
        private String surname;
    
        @ManyToOne
        private Address address;
    
        // add getters, setters, constructors, equals and hashCode here
    }

감사를 위해 Jakarta Persistence 엔터티가 구성되면 기록 변경 사항을 저장하기 위해 _AUD 라는 테이블이 생성됩니다.

6.4. 설정

6.4.1. 인버스 매개 변수 구성

JBoss EAP는 Hibernate Envers를 통해 엔터티 감사를 사용하여 영구 클래스의 이전 변경 사항을 추적합니다.

사용 가능한 Envers 매개변수 구성

  1. 애플리케이션에 대한 persistence.xml 파일을 엽니다.
  2. 필요에 따라 Envers 속성을 추가, 제거 또는 구성합니다. 사용 가능한 속성 목록은 구성 속성 삽입을 참조하십시오.

    예제: 인버스 매개 변수

    <persistence-unit name="mypc">
      <description>Persistence Unit.</description>
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
      <properties>
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.cache.use_query_cache" value="true" />
        <property name="hibernate.generate_statistics" value="true" />
        <property name="org.hibernate.envers.versionsTableSuffix" value="_V" />
        <property name="org.hibernate.envers.revisionFieldName" value="ver_rev" />
      </properties>
    </persistence-unit>

6.4.2. 런타임 시 감사 활성화 또는 비활성화

런타임 시 엔터티 버전 감사 활성화 또는 비활성화

  1. AuditEventListener 클래스의 하위 클래스입니다.
  2. Hibernate 이벤트에서 호출되는 다음 메서드를 재정의합니다.

    • onPostInsert
    • onPostUpdate
    • onPostDelete
    • onPreUpdateCollection
    • onPreRemoveCollection
    • onPostRecreateCollection
  3. 하위 클래스를 이벤트 리스너로 지정합니다.
  4. 변경 사항을 감사해야 하는지 확인합니다.
  5. 변경 감사를 수행해야 하는 경우 호출을 슈퍼 클래스로 전달합니다.

6.4.3. 조건부 감사 구성

Hibernate Envers는 일련의 이벤트 리스너를 사용하여 다양한 Hibernate 이벤트에 대한 감사 데이터를 유지합니다. Envers JAR이 클래스 경로에 있는 경우 이러한 리스너는 자동으로 등록됩니다.

조건부 감사 구현

  1. persistence .xml 파일에서 hibernate.listeners.envers.autoRegister Hibernate 속성을 false로 설정합니다.
  2. 하위 클래스 각 이벤트 리스너를 재정의합니다. 조건부 감사 논리를 하위 클래스에 배치하고 감사를 수행해야 하는 경우 수퍼 메서드를 호출합니다.
  3. org.hibernate. envers.event.EnversIntegrator와 유사하게 org.hibernate.integrator.spi.Integrator 의 사용자 정의 구현을 만듭니다. 기본 클래스가 아닌 2단계로 생성된 이벤트 리스너 하위 클래스를 사용합니다.
  4. META-INF/services/org.hibernate.integrator.spi.Integrator 파일을 JAR에 추가합니다. 이 파일에는 인터페이스를 구현하는 클래스의 정규화된 이름이 포함되어야 합니다.

6.4.4. 구성 속성 연결

Expand
표 6.1. 엔터티 데이터 버전 설정 매개변수
속성 이름기본값설명

org.hibernate.envers.audit_table_prefix

 

감사 정보를 보유할 엔터티의 이름을 생성하기 위한 감사 엔터티 이름에 앞에 오는 문자열입니다.

org.hibernate.envers.audit_table_suffix

_AUD

감사 정보를 보유할 엔터티의 이름을 생성하기 위해 감사된 엔터티 이름에 추가되는 문자열입니다. 예를 들어 테이블 이름이 Person 인 엔터티를 감사하면 Envers는 Person_AUD 라는 테이블을 생성하여 기록 데이터를 저장합니다.

org.hibernate.envers.revision_field_name

REV

버전 번호를 보유한 감사 엔터티의 필드 이름입니다.

org.hibernate.envers.revision_type_field_name

구조 유형

버전 유형을 보유한 감사 엔터티의 필드 이름입니다. 현재 가능한 리버전 유형은 각각 삽입, 수정 또는 삭제를 위한 add,moddel 입니다.

org.hibernate.envers.revision_on_collection_change

true

이 속성은 소유하지 않은 관계 필드가 변경되지 않은 경우 리버전을 생성해야 하는지 여부를 결정합니다. 이는 일대다 관계의 컬렉션이거나 일대일 관계에서 mappedBy 속성을 사용하는 필드일 수 있습니다.

org.hibernate.envers.do_not_audit_optimistic_locking_field

true

true인 경우 최적화된 잠금에 사용되는 속성 (@Version으로 주석이 추가됨)은 감사에서 자동으로 제외됩니다.

org.hibernate.envers.store_data_at_delete

false

이 속성은 ID 대신 엔터티 데이터를 삭제할 때 null로 표시된 다른 모든 속성과 함께 엔터티 데이터를 버전에 저장할지 여부를 정의합니다. 데이터가 마지막 버전에 있으므로 일반적으로 필요하지는 않습니다. 그러나 마지막 버전에서 액세스하는 것이 더 쉽고 효율적일 수 있습니다. 그러나 이는 삭제 전에 포함된 엔터티가 두 번 저장된다는 것을 의미합니다.

org.hibernate.envers.default_schema

null(일반 테이블과 동일)

감사 테이블에 사용되는 기본 스키마 이름입니다. @AuditTable(schema="…​") 주석. 없는 경우 스키마는 일반 테이블의 스키마와 동일합니다.

org.hibernate.envers.default_catalog

null(일반 테이블과 동일)

감사 테이블에 사용해야 하는 기본 카탈로그 이름입니다. @AuditTable(catalog="…​​") 주석. 없는 경우 카탈로그는 일반 테이블의 카탈로그와 동일합니다.

org.hibernate.envers.audit_strategy

org.hibernate.envers.strategy.DefaultAuditStrategy

이 속성은 감사 데이터를 유지할 때 사용해야 하는 감사 전략을 정의합니다. 기본적으로 엔터티가 수정된 버전만 저장됩니다. 또는 org.hibernate.envers.strategy.ValidityAuditStrategy 는 시작 버전과 최종 버전을 모두 저장합니다. 이러한 값은 감사 행이 유효한 시기를 정의합니다.

org.hibernate.envers.audit_strategy_validity_end_rev_field_name

취소

감사 엔터티의 최종 버전 번호를 보유할 열 이름입니다. 이 속성은 유효 감사 전략을 사용하는 경우에만 유효합니다.

org.hibernate.envers.audit_strategy_validity_store_revend_timestamp

false

이 속성은 데이터가 마지막으로 유효한 버전인 최종 버전의 타임스탬프를 최종 버전 자체 외에 저장해야 하는지 여부를 정의합니다. 이 기능은 테이블 파티션을 사용하여 관계형 데이터베이스에서 이전 감사 레코드를 제거할 수 있는 데 유용합니다. 파티셔닝에는 테이블 내에 있는 열이 필요합니다. 이 속성은 ValidityAuditStrategy 가 사용되는 경우에만 평가됩니다.

org.hibernate.envers.audit_strategy_validity_revend_timestamp_field_name

REVEND_TSTMP

데이터가 계속 유효한 시점의 최종 버전 타임스탬프의 열 이름입니다. ValidityAuditStrategy 를 사용하고 org.hibernate.envers.audit_strategy_validity_store_revend_timestamp 가 true로 평가되는 경우에만 사용됩니다.

6.5. 감사 정보 쿼리

6.5.1. 쿼리를 통해 감사 정보 검색

Hibernate Envers는 쿼리를 통해 감사 정보를 검색하는 기능을 제공합니다.

참고

감사된 데이터에 대한 쿼리는 상관 관계가 있는 하위 선택 항목이 포함되어 있으므로 실시간 데이터에 대한 해당 쿼리보다 훨씬 느립니다.

지정된 버전에서 클래스 엔티티 쿼리

이 유형의 쿼리의 진입점은 다음과 같습니다.

AuditQuery query = getAuditReader()
    .createQuery()
    .forEntitiesAtRevision(MyEntity.class, revisionNumber);

그런 다음 AuditEntity 팩토리 클래스를 사용하여 제약 조건을 지정할 수 있습니다. 아래 쿼리는 name 속성이 John 과 같은 엔티티만 선택합니다.

query.add(AuditEntity.property("name").eq("John"));

아래 쿼리는 지정된 엔터티와 관련된 엔터티만 선택합니다.

query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));

그런 다음 결과를 주문하고 제한할 수 있으며 집계 및 예측(그룹 지정 제외)을 설정할 수 있습니다. 아래 예는 전체 쿼리입니다.

List personsAtAddress = getAuditReader().createQuery()
    .forEntitiesAtRevision(Person.class, 12)
    .addOrder(AuditEntity.property("surname").desc())
    .add(AuditEntity.relatedId("address").eq(addressId))
    .setFirstResult(4)
    .setMaxResults(2)
    .getResultList();

지정된 클래스의 엔터티가 변경된 버전 쿼리

이 유형의 쿼리의 진입점은 다음과 같습니다.

AuditQuery query = getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true);

이전 예제와 동일한 방식으로 이 쿼리에 제약 조건을 추가할 수 있습니다. 이 쿼리에는 다음과 같은 추가 가능성이 있습니다.

AuditEntity.revisionNumber()
audited 엔터티가 수정된 버전 번호에 제약 조건, 예측 및 순서를 지정합니다.
AuditEntity.revisionProperty(propertyName)
audited 엔터티가 수정된 버전에 해당하는 revision 엔터티의 속성에 제약 조건, 예측 및 순서를 지정합니다.
AuditEntity.revisionType()
버전 유형에 대한 액세스를 제공합니다(ADD, MOD, DEL).

그러면 필요에 따라 쿼리 결과를 조정할 수 있습니다. 아래 쿼리는 버전 번호 42 후 entity Id ID가 변경된 MyEntity 클래스의 엔터티 가 변경된 최소 버전 번호를 선택합니다.

Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.id().eq(entityId))
    .add(AuditEntity.revisionNumber().gt(42))
    .getSingleResult();

버전에 대한 쿼리는 특성을 최소화/최대화할 수도 있습니다. 아래 쿼리는 지정된 엔터티에 대한 realDate 값이 지정된 값보다 크지만 가능한 작은 버전을 선택합니다.

Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    // We are only interested in the first revision
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.property("actualDate").minimize()
        .add(AuditEntity.property("actualDate").ge(givenDate))
        .add(AuditEntity.id().eq(givenEntityId)))
    .getSingleResult();

minimize()maximize() 메서드는 제한 조건을 추가할 수 있는 기준을 반환하며, 이러한 제약 조건을 최대화/최소화된 속성을 가진 엔터티에서 충족해야 합니다.

쿼리 생성 시 전달되는 두 개의 부울 매개 변수가 있습니다.

selectEntitiesOnly

이 매개변수는 명시적 예측이 설정되지 않은 경우에만 유효합니다.
true인 경우 쿼리 결과는 지정된 제약 조건을 충족하는 수정 시 변경된 엔터티 목록이 됩니다.
false인 경우 결과는 3개의 요소 배열 목록입니다. 첫 번째 요소는 변경된 엔터티 인스턴스가 됩니다. 두 번째는 버전 데이터를 포함하는 엔터티입니다. 사용자 지정 엔터티를 사용하지 않는 경우 이 엔터티는 DefaultRevisionEntity 의 인스턴스입니다. 세 번째 요소 배열은 버전 유형(ADD, MOD, DEL)입니다.
selectDeletedEntities
이 매개변수는 엔터티를 삭제한 리버전을 결과에 포함시켜야 하는지를 지정합니다. true인 경우 엔터티에 버전 유형 DEL 및 id를 제외한 모든 필드의 값이 null 이 됩니다.

지정된 속성을 수정한 엔터티 버전 쿼리

아래 쿼리는 지정된 ID가 있는 MyEntity 의 모든 개정 사항을 반환하며, 여기서 real Date 속성이 변경되었습니다.

AuditQuery query = getAuditReader().createQuery()
  .forRevisionsOfEntity(MyEntity.class, false, true)
  .add(AuditEntity.id().eq(id));
  .add(AuditEntity.property("actualDate").hasChanged())

hasChanged 조건은 추가 기준과 결합할 수 있습니다. 아래 쿼리는 revisionNumber가 생성된 시점에 MyEntity 의 수평 슬라이스를 반환합니다. 이는 prop1을 수정했지만 prop 2 가 아닌 버전으로 제한됩니다.

AuditQuery query = getAuditReader().createQuery()
  .forEntitiesAtRevision(MyEntity.class, revisionNumber)
  .add(AuditEntity.property("prop1").hasChanged())
  .add(AuditEntity.property("prop2").hasNotChanged());

결과 세트에는 revisionNumber보다 숫자가 낮은 버전도 포함됩니다. 즉, 이 쿼리를 "prov 1이 수정되고 prop 2 를 그대로 사용하여 revisionNumber에서 모든 MyEntities 변경"으로 읽을 수 없습니다.

아래 쿼리는 forEntitiesModifiedAtRevision 쿼리를 사용하여 이 결과를 반환하는 방법을 보여줍니다.

AuditQuery query = getAuditReader().createQuery()
  .forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
  .add(AuditEntity.property("prop1").hasChanged())
  .add(AuditEntity.property("prop2").hasNotChanged());

지정된 버전에서 수정된 쿼리 항목

아래 예제에서는 지정된 버전에서 수정된 엔터티에 대한 기본 쿼리를 보여줍니다. 이를 통해 지정된 버전에서 엔터티 이름 및 해당 클래스를 변경할 수 있습니다.

Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
    .getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);

org.hibernate.envers.CrossTypeRevisionChangesReader에서도 액세스할 수 있는 다른 많은 쿼리가 있습니다.

List<Object> findEntities(Number)
지정된 버전에서 변경된 모든 감사 엔터티의 스냅샷을(추가, 업데이트 및 제거) 반환합니다. n+1 SQL 쿼리를 실행합니다. 여기서 n 은 지정된 버전 내에서 수정된 여러 다른 엔터티 클래스입니다.
List<Object> findEntities(Number, RevisionType)
수정 유형별로 필터링된 지정된 버전에서 변경된(추가, 업데이트 또는 제거) 감사된 모든 엔터티의 스냅샷을 반환합니다. n+1 SQL 쿼리를 실행합니다. 여기서 n 은 지정된 버전 내에서 수정된 여러 다른 엔터티 클래스입니다. Map<RevisionType, List<Object>>
findEntitiesGroupByRevisionType(Number)
수정 작업에서 그룹화된 엔터티 스냅샷 목록(예: 추가, 업데이트 또는 제거)이 포함된 맵을 반환합니다. 3n+1 SQL 쿼리를 실행합니다. 여기서 n 은 지정된 버전 내에서 수정된 여러 다른 엔터티 클래스입니다.

6.5.2. 참조된 엔티티 속성을 사용하여 엔터티 연결 전달

참조된 엔터티의 속성을 사용하여 쿼리에서 엔터티를 이동할 수 있습니다. 이를 통해 일대일 및 다대일 연결을 쿼리할 수 있습니다.

아래 예제에서는 쿼리에서 엔터티를 탐색할 수 있는 몇 가지 방법을 보여줍니다.

  • 개정 번호 1에서는 소유자가 20세 또는 주소 번호 30에 있는 자동차를 찾은 다음, 자동차에서 설정한 결과를 주문합니다.

    List<Car> resultList = auditReader.createQuery()
                    .forEntitiesAtRevision( Car.class, 1 )
                    .traverseRelation( "owner", JoinType.INNER, "p" )
                    .traverseRelation( "address", JoinType.INNER, "a" )
                    .up().up().add( AuditEntity.disjunction().add(AuditEntity.property( "p", "age" )
                           .eq( 20 ) ).add( AuditEntity.property( "a", "number" ).eq( 30 ) ) )
                    .addOrder( AuditEntity.property( "make" ).asc() ).getResultList();
  • 버전 번호 1에서 소유자 유효 기간이 소유자 주소 번호와 같은 드라이버를 찾습니다.

    Car result = (Car) auditReader.createQuery()
                    .forEntitiesAtRevision( Car.class, 1 )
                    .traverseRelation( "owner", JoinType.INNER, "p" )
                    .traverseRelation( "address", JoinType.INNER, "a" )
                    .up().up().add(AuditEntity.property( "p", "age" )
                            .eqProperty( "a", "number" ) ).getSingleResult();
  • 개정 번호 1에서는 소유자가 20세이거나 소유자가 없는 모든 자동차를 찾습니다.

    List<Car> resultList = auditReader.createQuery()
                    .forEntitiesAtRevision( Car.class, 1 )
                    .traverseRelation( "owner", JoinType.LEFT, "p" )
                    .up().add( AuditEntity.or( AuditEntity.property( "p", "age").eq( 20 ),
                            AuditEntity.relatedId( "owner" ).eq( null ) ) )
                    .addOrder( AuditEntity.property( "make" ).asc() ).getResultList();
  • 개정 번호 1에서는 제조가 "car3"인 모든 자동차와 소유자가 30세이거나 소유자가 없는 모든 자동차를 찾습니다.

    List<Car> resultList = auditReader.createQuery()
                    .forEntitiesAtRevision( Car.class, 1 )
                    .traverseRelation( "owner", JoinType.LEFT, "p" )
                    .up().add( AuditEntity.and( AuditEntity.property( "make" ).eq( "car3" ), AuditEntity.property( "p", "age" ).eq( 30 ) ) )
                    .getResultList();
  • 개정 번호 1에서는 제조가 "car3"인 모든 자동차 또는 소유자가 10세 또는 소유자가 없는 경우를 찾습니다.

    List<Car> resultList = auditReader.createQuery()
                    .forEntitiesAtRevision( Car.class, 1 )
                    .traverseRelation( "owner", JoinType.LEFT, "p" )
                    .up().add( AuditEntity.or( AuditEntity.property( "make" ).eq( "car3" ), AuditEntity.property( "p", "age" ).eq( 10 ) ) )
                    .getResultList();

6.6. 성능 튜닝

6.6.1. 대체 배치 로드 알고리즘

Hibernate를 사용하면 join, select, subselect 및 batch의 네 가지 가져오기 전략 중 하나를 사용하여 연결에 대한 데이터를 로드할 수 있습니다. 이러한 네 가지 전략 중에서 배치 로드를 사용하면 선택 가져오기를 위한 최적화 전략이므로 가장 큰 성능상의 이점을 얻을 수 있습니다. 이 전략에서 Hibernate는 기본 또는 외부 키 목록을 지정하여 단일 SELECT 문으로 엔터티 인스턴스 또는 컬렉션 배치를 검색합니다. 배치 가져오기는 지연 선택 가져오기 전략의 최적화입니다.

배치 가져오기를 구성하는 방법은 클래스별 수준 또는 수집 수준입니다.

  • 클래스별 수준

    Hibernate는 각 수준에서 데이터를 로드할 때 쿼리 시 사전 로드에 연관의 배치 크기가 필요합니다. 예를 들어 런타임 시 세션에 로드된 Car 오브젝트의 인스턴스 30개가 있다고 가정합니다. 각 Car 오브젝트는 소유자 오브젝트에 속합니다. 모든 자동차 객체를 반복하여 소유자를 요청하는 경우 지연 로드를 통해 Hibernate는 각 소유자당 하나씩 30개의 선택 문을 발행합니다. 성능 병목 현상입니다.

    대신, Hibernate에 쿼리를 통해 검색되기 전에 다음 소유자 배치에 대한 데이터를 미리 로드하도록 지시할 수 있습니다. 소유자 오브젝트를 쿼리하면 Hibernate는 동일한 SELECT 문에서 이러한 오브젝트를 훨씬 더 쿼리합니다.

    사전에 쿼리할 소유자 오브젝트 수는 구성 시 지정된 batch-size 매개변수에 따라 다릅니다.

    <class name="owner" batch-size="10"></class>

    이는 Hibernate에 가까운 미래에 필요할 것으로 예상하는 소유자 개체 10개를 더 쿼리하도록 지시합니다. 사용자가 자동차 A소유자를 쿼리하면 B소유자가 배치 로드의 일부로 이미 로드되었을 수 있습니다. 사용자가 실제로 자동차 B소유자가 필요한 경우 데이터베이스로 이동하고 SELECT 문을 발행하는 대신 현재 세션에서 값을 검색할 수 있습니다.

    Hibernate 4.2.0은 batch-size 매개 변수 외에도 배치 로드 성능을 개선하기 위한 새 구성 항목을 도입했습니다. 구성 항목을 Batch Fetchstyle 구성이라고 하며 hibernate.batch_fetch_style 매개 변수로 지정합니다.

    다음 세 가지 배치 가져오기 스타일이 지원됩니다. LEGACY, PADDED 및 DYNAMIC. 사용할 스타일을 지정하려면 org.hibernate.cfg.AvailableSettings#BATCH_FETCH_STYLE 을 사용합니다.

    • 레거시: 레거시 로드 스타일에서는 ArrayHelper.getBatchSizes(int) 를 기반으로 미리 구축된 배치 크기 세트를 사용합니다. 배치는 기존 배치 가능한 식별자 수에서 차세대 미리 빌드된 배치 크기를 사용하여 로드됩니다.

      위의 예제에서 배치 크기 설정이 30이면 미리 구성된 배치 크기는 [30, 15, 10, 9, 8, 7, .., 1]입니다. 부하 29개 식별자를 배치하려고 하면 15, 10, 4가 배치됩니다. 해당 SQL 쿼리에는 각각 데이터베이스에서 15, 10 및 4 소유자가 로드됩니다.

    • PADDED - Padded는 배치 로드의 LEGACY 스타일과 유사합니다. 여전히 미리 구축된 배치 크기를 활용하지만, 다음 큰 배치 크기를 사용하고 추가 식별자 자리 표시자를 패치합니다.

      위 예제와 마찬가지로 30개 소유자 오브젝트를 초기화해야 하는 경우 데이터베이스에 대해 하나의 쿼리만 실행됩니다.

      그러나 29개 소유자 개체를 초기화할 경우 Hibernate는 여전히 배치 크기 30의 SQL select 문 하나만 실행하고, 추가 공간은 반복 식별자로 채워집니다.

    • 동적 - 배치 크기 제한 사항을 준수하지만 이 배치 로드 스타일은 로드할 실제 오브젝트 수를 사용하여 SQL SELECT 문을 동적으로 빌드합니다.

      예를 들어 30개 소유자 개체의 경우 최대 배치 크기가 30이면 30개 소유자 개체를 검색하면 하나의 SQL SELECT 문이 생성됩니다. 35번 검색 호출을 실행하면 각각 배치 크기가 30 및 5인 두 개의 SQL 문이 생성됩니다. Hibernate는 배치 크기로 30이라는 제한 하에 유지되도록 두 번째 SQL 문을 동적으로 5개로 변경합니다. 두 번째 SQL은 PADDED를 가져오지 않으며 LEGACY 스타일과는 달리 두 번째 SQL 문에는 고정된 크기가 없습니다. 두 번째 SQL은 동적으로 생성됩니다.

      30개 이하의 식별자를 쿼리하는 경우 이 스타일은 요청된 식별자 수만 동적으로 로드합니다.

  • 수집 기준 수준

    Hibernate는 위의 클래스 섹션에 나열된 대로 배치 가져오기 크기 및 스타일을 이행하는 배치 로드 컬렉션도 수행할 수 있습니다.

    이전 섹션에서 사용된 예제를 되돌리려면 각 소유자 오브젝트가 소유한 모든 Car 오브젝트를 로드해야 한다고 고려합니다. 모든 소유자를 통해 반복되는 현재 세션에 10개의 소유자 개체가 로드되면 10개의 SELECT 문이 생성되며, 각각 getœs() 호출에 사용됩니다. 소유자 매핑에서 자동차 컬렉션에 대한 배치 가져오기를 활성화하면 Hibernate는 다음과 같이 이러한 컬렉션을 미리 가져올 수 있습니다.

    <class name="Owner"><set name="cars" batch-size="5"></set></class>

    따라서 배치 크기가 5개이고 레거시 배치 스타일을 사용하여 10개의 컬렉션을 로드하는 경우 Hibernate는 두 개의 SELECT 문으로 각각 5개의 컬렉션을 검색합니다.

6.6.2. 변경 불가능한 데이터에 대한 개체 참조의 두 번째 수준 캐싱

Hibernate는 성능 향상을 위해 메모리 내에서 자동으로 데이터를 캐시합니다. 이 작업은 특히 거의 변경되지 않는 데이터를 위해 데이터베이스 조회가 필요한 횟수를 줄여주는 인메모리 캐시를 통해 수행됩니다.

Hibernate는 두 가지 유형의 캐시를 유지 관리합니다. 첫 번째 수준 캐시라고도 하는 기본 캐시는 필수입니다. 이 캐시는 현재 세션과 연결되며 모든 요청이 이를 통과해야 합니다. 보조 캐시(두 번째 수준 캐시라고도 함)는 선택 사항이며 기본 캐시를 참조한 후에만 참조됩니다.

데이터는 먼저 상태 배열로 제거하여 두 번째 수준 캐시에 저장됩니다. 이 배열은 깊이 복사되며 해당 깊은 사본이 캐시에 배치됩니다. 그 반대로 캐시에서 읽을 수 있습니다. 이는 변경 가능한 데이터(변경 불가능한 데이터)에 적합하지만 변경 불가능한 데이터에는 비효율적입니다.

심도 있는 복사 데이터는 메모리 사용 및 처리 속도 측면에서 비용이 많이 드는 작업입니다. 대용량 데이터 세트의 경우 메모리 및 처리 속도가 성능 제한 요소가 됩니다. Hibernate를 사용하면 복사하지 않고 변경할 수 없는 데이터를 참조하도록 지정할 수 있습니다. 이제 전체 데이터 세트를 복사하는 대신 Hibernate는 이제 캐시의 데이터에 대한 참조를 저장할 수 있습니다.

구성 설정 hibernate.cache.use_reference_entries 값을 true 로 변경하여 수행할 수 있습니다. 기본적으로 hibernate.cache.use_reference_entriesfalse 로 설정됩니다.

hibernate.cache.use_reference_entriestrue 로 설정되면 연관이 없는 변경 불가능한 데이터 오브젝트가 두 번째 수준 캐시에 복사되지 않고 해당 오브젝트에 대한 참조만 저장됩니다.

주의

hibernate.cache.use_reference_entriestrue 로 설정하면 연관이 있는 변경 불가능한 데이터 오브젝트가 여전히 두 번째 수준 캐시에 복사됩니다.

부록 A. 참고 자료

A.1. Hibernate 속성

Expand
표 A.1. persistence.xml 파일에서 구성 가능한 연결 속성
속성 이름현재의설명

javax.persistence.jdbc.driver

org.hsqldb.jdbcDriver

사용할 JDBC 드라이버의 클래스 이름입니다.

javax.persistence.jdbc.user

SA

사용자 이름.

javax.persistence.jdbc.password

 

암호.

javax.persistence.jdbc.url

jdbc:hsqldb:.

JDBC 연결 URL입니다.

Expand
표 A.2. Hibernate 구성 속성
속성 이름설명

hibernate.dialect

Hibernate org.hibernate.dialect.Dialect 의 클래스 이름입니다. Hibernate에서 특정 관계형 데이터베이스에 최적화된 SQL을 생성할 수 있도록 합니다.

대부분의 경우 Hibernate는 JDBC 드라이버에서 반환한 JDBC 메타데이터를 기반으로 올바른 org.hibernate.dialect.Dialect 구현을 선택할 수 있습니다.

hibernate.show_sql

부울. 모든 SQL 문을 콘솔에 씁니다. 이는 로그 범주를 debug 하도록 org.hibernate.SQL 을 설정하는 대신 사용됩니다.

hibernate.format_sql

부울. 로그와 콘솔에서 SQL을 인쇄합니다.

hibernate.default_schema

생성된 SQL에서 지정된 스키마/표 공간을 사용하여 정규화되지 않은 테이블 이름을 지정합니다.

hibernate.default_catalog

생성된 SQL에서 지정된 카탈로그로 정규화되지 않은 테이블 이름을 정규화합니다.

hibernate.session_factory_name

org.hibernate.SessionFactory는 Java Naming 및 Directory Interface에서 이 이름에 자동으로 바인딩됩니다. 예를 들면 jndi/composite/name.Jpa입니다.

hibernate.max_fetch_depth

단일 종료 연관(일대일, 다대일)의 외부 조인 가져오기 트리의 최대 깊이를 설정합니다. 0 은 기본 외부 조인 가져오기를 비활성화합니다. 권장 값은 0 에서 3 사이입니다.

hibernate.default_batch_fetch_size

연관을 가져오는 Hibernate 배치의 기본 크기를 설정합니다. 권장 값은 4,8, 16 입니다.

hibernate.default_entity_mode

SessionFactory 에서 연 모든 세션에 대한 엔터티 표현의 기본 모드를 설정합니다. 값이 다음과 같습니다. dynamic-map,dom4j,pojo.

hibernate.order_updates

부울. 업데이트되는 항목의 기본 키 값에 따라 Hibernate가 SQL 업데이트를 주문하도록 합니다. 그러면 고도의 동시 시스템에서 트랜잭션 교착 상태가 줄어듭니다.

hibernate.generate_statistics

부울. 활성화된 경우 Hibernate는 성능 튜닝에 유용한 통계를 수집합니다.

hibernate.use_identifier_rollback

부울. 활성화된 경우 개체가 삭제될 때 생성된 식별자 속성이 기본값으로 재설정됩니다.

hibernate.use_sql_comments

부울. 켜진 경우 Hibernate는 더 쉬운 디버깅을 위해 SQL 내부에 주석을 생성합니다. 기본값은 false 입니다.

hibernate.id.new_generator_mappings

부울. 이 속성은 @GeneratedValue를 사용할 때 관련이 있습니다. 새로운 IdentifierGenerator 구현이 javax.persistence.GenerationType.AUTO, javax.persistence.GenerationType.TABLE 및 javax.persistence.GenerationType.SEQUENCE에 사용되는지 여부를 나타냅니다. 기본값은 true 입니다.

hibernate.ejb.naming_strategy

Hibernate EntityManager를 사용할 때 org.hibernate.cfg.NamingStrategy 구현을 선택합니다. hibernate.ejb.naming_strategy 는 더 이상 Hibernate 5.0에서 지원되지 않습니다. 사용된 경우 더 이상 지원되지 않으며 분할 ImplicitNamingStrategy 및 PhysicalNamingStrategy가 제거되었음을 나타내는 사용 중단 메시지가 기록됩니다.

애플리케이션이 EntityManager를 사용하지 않는 경우 다음 지침에 따라 NamingStrategy를 구성합니다. Hibernate 참조 설명서 - 전략 명명.

MetadataBuilder를 사용한 기본 부트 스트랩 및 암시적 명명 전략을 적용하는 예제는 Hibernate 5.0 문서의 http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#bootstrap-native-metadata 을 참조하십시오. 물리적 명명 전략은 MetadataBuilder.applyPhysicalNamingStrategy() 를 사용하여 적용할 수 있습니다. org.hibernate.boot.MetadataBuilder 에 대한 자세한 내용은 https://docs.jboss.org/hibernate/orm/5.0/javadocs/ 을 참조하십시오.

hibernate.implicit_naming_strategy

사용할 org.hibernate.boot.model.naming.ImplicitNamingStrategy 클래스를 지정합니다. hibernate.implicit_naming_strategy 를 사용하여 ImplicitNamingStrategy를 구현하는 사용자 지정 클래스를 구성할 수도 있습니다. 다음 단축 이름은 이 설정에 대해 정의됩니다.

  • default - ImplicitNamingStrategyJpaCompliantImpl
  • jpa - ImplicitNamingStrategyJpaCompliantImpl
  • legacy-jpa - ImplicitNamingStrategyLegacyJpaImpl
  • legacy-hbm - ImplicitNamingStrategyLegacyHbmImpl
  • component-path - ImplicitNamingStrategyComponentPathImpl

기본 설정은 기본 짧은 이름의 ImplicitNamingStrategy 에 의해 정의됩니다. 기본 설정이 비어 있는 경우 대체는 ImplicitNamingStrategyJpaCompliantImpl 을 사용하는 것입니다.

hibernate.physical_naming_strategy

데이터베이스 개체 이름에 대한 물리적 이름 지정 규칙을 적용하기 위한 플러그 방식 전략 계약입니다. 사용할 PhysicalNamingStrategy 클래스를 지정합니다. PhysicalNamingStrategyStandardImpl 은 기본적으로 사용됩니다. hibernate.physical_naming_strategy 를 사용하여 PhysicalNamingStrategy를 구현하는 사용자 지정 클래스를 구성할 수도 있습니다.

중요

hibernate.id.new_generator_mappings의 경우 새 애플리케이션은 기본값인 true 를 유지해야 합니다. Hibernate 3.3.x를 사용한 기존 애플리케이션은 시퀀스 개체 또는 테이블 기반 생성기를 계속 사용하고 이전 버전과의 호환성을 유지하도록 false로 변경해야 할 수 있습니다.

Expand
표 A.3. Hibernate JDBC 및 연결 속성
속성 이름설명

hibernate.jdbc.fetch_size

JDBC 가져오기 크기를 결정하는 0이 아닌 값입니다(calls statement.setFetchSize()).

hibernate.jdbc.batch_size

0이 아닌 값을 사용하면 Hibernate에서 JDBC2 배치 업데이트를 사용할 수 있습니다. 권장 값은 5 에서 30 사이입니다.

hibernate.jdbc.batch_versioned_data

부울. JDBC 드라이버가 executeBatch() 에서 올바른 행 수를 반환하는 경우 이 속성을 true 로 설정합니다. 그런 다음 Hibernate는 자동으로 버전화된 데이터에 배치된 DML을 사용합니다. 기본값은 false 입니다.

hibernate.jdbc.factory_class

사용자 지정 org.hibernate.jdbc.Batcher를 선택합니다. 대부분의 애플리케이션에는 이 구성 속성이 필요하지 않습니다.

hibernate.jdbc.use_scrollable_resultset

부울. Hibernate에서 JDBC2 스크롤 가능한 결과 사용 가능. 이 속성은 사용자가 제공하는 JDBC 연결을 사용하는 경우에만 필요합니다. Hibernate는 연결 메타데이터를 사용하지 않습니다.

hibernate.jdbc.use_streams_for_binary

부울. 이는 시스템 수준 속성입니다. 바이너리 또는 직렬화 가능한 유형을 JDBC에/에서 작성할 때 스트림을 사용합니다.

hibernate.jdbc.use_get_generated_keys

부울. PreparedStatement.getGeneratedKeys() 를 사용하여 삽입 후 기본적으로 생성된 키를 검색합니다. JDBC3+ 드라이버와 JRE1.4 이상이 필요합니다. JDBC 드라이버에 Hibernate 식별자 생성기에 문제가 있는 경우 false로 설정합니다. 기본적으로 연결 메타데이터를 사용하여 드라이버 기능을 확인합니다.

hibernate.connection.provider_class

Hibernate에 JDBC 연결을 제공하는 사용자 지정 org.hibernate.connection.ConnectionProvider의 클래스 이름입니다.

hibernate.connection.isolation

JDBC 트랜잭션 격리 수준을 설정합니다. java.sql.Connection에 의미 있는 값이 있는지 확인하지만 대부분의 데이터베이스는 모든 격리 수준을 지원하지 않으며 일부는 표준이 아닌 추가 격리를 정의합니다. 표준 값은 1, 2, 4, 8 입니다.

hibernate.connection.autocommit

부울. 이 속성은 사용하지 않는 것이 좋습니다. JDBC 풀링 연결에 대해 자동 커밋을 활성화합니다.

hibernate.connection.release_mode

Hibernate에서 JDBC 커넥션을 릴리스해야 하는 시기를 지정합니다. 기본적으로 세션이 명시적으로 종료되거나 연결이 끊어질 때까지 JDBC 연결이 유지됩니다. 기본 값은 Jakarta 트랜잭션 및 CMT 트랜잭션 전략에 after_statement 를 선택하고 JDBC 트랜잭션 전략에 after_transaction 을 선택합니다.

사용 가능한 값은 auto(기본값), on_close, after_transaction,after_statement 입니다.

이 설정은 SessionFactory.openSession 에서 반환된 세션에만 영향을 미칩니다. SessionFactory.getCurriteSession 을 통해 얻은 세션의 경우, 사용을 위해 구성된 CurrentSessionContext 구현은 해당 세션의 연결 릴리스 모드를 제어합니다.

hibernate.connection.<propertyName>

JDBC 속성 <propertyName>DriverManager.getConnection() 에 전달합니다.

hibernate.jndi.<propertyName>

<propertyName> 속성을 Java Naming 및 Directory Interface InitialContextFactory 로 전달합니다.

Expand
표 A.4. Hibernate 캐시 속성
속성 이름설명

hibernate.cache.region.factory_class

사용자 지정 CacheProvider 의 클래스 이름입니다.

hibernate.cache.use_minimal_puts

부울. 두 번째 수준 캐시 작업을 최적화하여 더 빈번한 읽기로 쓰기를 최소화합니다. 이 설정은 클러스터된 캐시에 가장 유용하며 Hibernate3에서는 클러스터된 캐시 구현에 기본적으로 활성화됩니다.

hibernate.cache.use_query_cache

부울. 쿼리 캐시를 활성화합니다. 개별 쿼리는 계속 캐시 가능해야 합니다.

hibernate.cache.use_second_level_cache

부울. <cache> 매핑을 지정하는 클래스에 대해 기본적으로 활성화되어 있는 두 번째 수준 캐시를 완전히 비활성화하는 데 사용됩니다.

hibernate.cache.query_cache_factory

사용자 정의 QueryCache 인터페이스의 클래스 이름입니다. 기본값은 기본 제공 StandardQueryCache 입니다.

hibernate.cache.region_prefix

두 번째 수준 캐시 지역 이름에 사용할 접두사입니다.

hibernate.cache.use_structured_entries

부울. Hibernate가 사용자에게 친숙한 형식으로 두 번째 수준 캐시에 데이터를 저장하도록 합니다.

hibernate.cache.default_cache_concurrency_strategy

@Cacheable 또는 @Cache가 사용되는 경우 사용할 기본 org.hibernate.annotations.CacheConcurrencyStrategy의 이름을 지정하는 데 사용되는 설정입니다. @Cache(strategy="..") 는 이 기본값을 재정의하는 데 사용됩니다.

Expand
표 A.5. Hibernate 트랜잭션 속성
속성 이름설명

hibernate.transaction.factory_class

Hibernate 트랜잭션 API 와 함께 사용할 TransactionFactory 의 클래스 이름입니다. 기본값은 JDBCTransactionFactory입니다.

jta.UserTransaction

애플리케이션 서버에서 자카르타 트랜잭션 사용자 전송을 얻기 위해 JTATransactionFactory 에서 사용하는 Java 네이밍 및 디렉터리 인터페이스 이름입니다.

hibernate.transaction.manager_lookup_class

TransactionManagerLookup의 클래스 이름입니다. JVM 수준 캐싱이 활성화되거나 자카르타 트랜잭션 환경에서 hilo 생성기를 사용할 때 필요합니다.

hibernate.transaction.flush_before_completion

부울. 활성화된 경우 트랜잭션을 완료하기 전 단계에서 세션이 자동으로 플러시됩니다. 기본 제공 및 자동 세션 컨텍스트 관리가 선호됩니다.

hibernate.transaction.auto_close_session

부울. 활성화된 경우 트랜잭션 완료 단계 동안 세션이 자동으로 종료됩니다. 기본 제공 및 자동 세션 컨텍스트 관리가 선호됩니다.

Expand
표 A.6. 기타 Hibernate 속성
속성 이름설명

hibernate.current_session_context_class

"current" 세션 의 범위를 위한 사용자 지정 전략을 제공합니다. 값에는 jta,thread,managed,custom.Class 가 있습니다.

hibernate.query.factory_class

HQL 구문 분석기 구현을 선택합니다 . org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory 또는 org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory.

hibernate.query.substitutions

Hibernate 쿼리의 토큰에서 SQL 토큰으로 매핑하는 데 사용됩니다(토큰은 기능 또는 리터럴 이름일 수 있음). 예를 들면 hqlLiteral=SQL_LITERAL, hqlœction=SQLFUNC 입니다.

hibernate.query.conventional_java_constants

Java 상수가 Java 명명 규칙을 따르는지 여부를 나타냅니다. 기본값은 false 입니다. 기존 애플리케이션은 기존 Java 상수가 애플리케이션에서 사용되는 경우에만 true 로 설정할 수 있습니다.

이 값을 true 로 설정하면 성능이 크게 향상됩니다. 그러면 Hibernate에서 별칭이 Java 명명 규칙을 따르는지 확인함으로써 Java 상수로 취급되는지 여부를 확인할 수 있기 때문입니다.

이 속성이 false 로 설정되면 Hibernate는 애플리케이션의 오버헤드인 클래스로 별칭을 로드하여 Java 상수로 취급합니다. 별칭이 클래스로 로드되지 않으면 Hibernate는 별칭을 Java 상수로 처리합니다.

hibernate.hbm2ddl.auto

SessionFactory 가 생성될 때 스키마 DDL을 데이터베이스로 자동 확인하거나 내보냅니다. create-drop 을 사용하면 SessionFactory 가 명시적으로 닫힐 때 데이터베이스 스키마가 삭제됩니다. 속성 값 옵션은 validate,update,create, create -drop입니다.

hibernate.hbm2ddl.import_files

SessionFactory 생성 중에 실행된 SQL DML 문이 포함된 선택적 파일의 쉼표로 구분된 이름입니다. 이는 테스트 또는 시연에 유용합니다. 예를 들어 INSERT 문을 추가하여 데이터베이스를 배포할 때 최소한의 데이터 집합으로 채울 수 있습니다. 예제 값은 / ruless.sql,/dogs.sql 입니다.

지정된 파일의 설명이 다음 파일의 설명보다 먼저 실행되므로 파일 순서가 중요합니다. 이러한 설명은 스키마가 생성되는 경우에만 실행됩니다(예: hibernate.hbm2ddl.autocreate 또는 create -drop 로 설정된 경우).

hibernate.hbm2ddl.import_files_sql_extractor

사용자 지정 ImportSqlCommandExtractor의 클래스 이름입니다. 기본값은 내장된 SingleLineSqlCommandExtractor입니다. 이는 각 가져오기 파일에서 단일 SQL 문을 추출하는 전용 구문 분석기를 구현하는 데 유용합니다. Hibernate는 또한 MultiplelinesSqlCommandExtractor를 제공하여 여러 줄에 분산된 명령/컴파일과 인용된 문자열을 지원합니다(각 문 끝에 필수 세미콜론).

hibernate.bytecode.use_reflection_optimizer

부울. 이것은 시스템 수준 속성으로, hibernate.cfg.xml 파일에서 설정할 수 없습니다. 런타임을 반영하는 대신 바이트코드 조작을 활성화합니다. 경우에 따라 문제 해결 시 유용할 수 있습니다. Hibernate에는 최적화 도구가 꺼져 있어도 항상 cglib 또는 javassist 가 필요합니다.

hibernate.bytecode.provider

javassist 또는 cglib 둘 다 바이트 조작 엔진으로 사용할 수 있습니다. 기본값은 javassist 입니다. 값은 javassist 또는 cglib 입니다.

Expand
표 A.7. Hibernate SQL Dialects (hibernate.dialect)
RDBMS전화 번호

DB2

org.hibernate.dialect.DB2Dialect

DB2 AS/400

org.hibernate.dialect.DB2400Dialect

DB2 OS390

org.hibernate.dialect.DB2390Dialect

타바마

org.hibernate.dialect.FirebirdDialect

FrontBase

org.hibernate.dialect.FrontbaseDialect

H2 데이터베이스

org.hibernate.dialect.H2Dialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

Informix

org.hibernate.dialect.InformixDialect

Ingres

org.hibernate.dialect.IngresDialect

Interbase

org.hibernate.dialect.InterbaseDialect

MariaDB 10

org.hibernate.dialect.MariaDB10Dialect

MariaDB Galera Cluster 10

org.hibernate.dialect.MariaDB10Dialect

Mckoi SQL

org.hibernate.dialect.MckoiDialect

Microsoft SQL Server 2000

org.hibernate.dialect.SQLServerDialect

Microsoft SQL Server 2005

org.hibernate.dialect.SQLServer2005Dialect

Microsoft SQL Server 2008

org.hibernate.dialect.SQLServer2008Dialect

Microsoft SQL Server 2012

org.hibernate.dialect.SQLServer2012Dialect

Microsoft SQL Server 2014

org.hibernate.dialect.SQLServer2012Dialect

Microsoft SQL Server 2016

org.hibernate.dialect.SQLServer2012Dialect

MySQL5

org.hibernate.dialect.MySQL5Dialect

MySQL5.5

org.hibernate.dialect.MySQL55Dialect

MySQL5.7

org.hibernate.dialect.MySQL57Dialect

Oracle (모든 버전)

org.hibernate.dialect.OracleDialect

Oracle 9i

org.hibernate.dialect.Oracle9iDialect

Oracle 10g

org.hibernate.dialect.Oracle10gDialect

Oracle 11g

org.hibernate.dialect.Oracle10gDialect

Oracle 12c

org.hibernate.dialect.Oracle12cDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

PostgreSQL 9.2

org.hibernate.dialect.PostgreSQL9Dialect

PostgreSQL 9.3

org.hibernate.dialect.PostgreSQL9Dialect

PostgreSQL 9.4

org.hibernate.dialect.PostgreSQL94Dialect

Postgres Plus 고급 서버

org.hibernate.dialect.PostgresPlusDialect

진행 상황

org.hibernate.dialect.ProgressDialect

SAP DB

org.hibernate.dialect.SAPDBDialect

Sybase

org.hibernate.dialect.SybaseASE15Dialect

Sybase 15.7

org.hibernate.dialect.SybaseASE157Dialect

Sybase 16

org.hibernate.dialect.SybaseASE157Dialect

Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

중요

애플리케이션 데이터베이스의 hibernate.dialect 속성은 올바른 org.hibernate.dialect.Dialect 하위 클래스로 설정해야 합니다. 전화선이 지정되면 Hibernate는 다른 일부 속성에 대해 적절한 기본값을 사용합니다. 즉 수동으로 지정할 필요가 없습니다.





2024-02-09에 최종 업데이트된 문서

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat
맨 위로 이동