이제 프로젝트 범위가 훨씬 넓어지고 Spring 유틸리티도 제공되기 때문에 프로젝트 이름이 Hibernate Types에서 Hypersistence Utils로 변경되었습니다.
이러한 이유로 Hibernate Types 2.x에서 Hypersistence Utils 3.x로 마이그레이션할 때 다음 단계를 따라야 합니다.
com.vladmihalcea.hibernate
에서 io.hypersistence.utils.hibernate
로 변경해야 합니다.com.vladmihalcea.spring
에서 io.hypersistence.utils.spring
으로 변경해야 합니다.그게 다야!
Hypersistence Utils 프로젝트는 Spring과 Hibernate 모두를 위한 범용 유틸리티를 제공합니다.
이 프로젝트의 가장 큰 장점은 Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 에서 6.2 , 6.1 , 6.0 , 5.6 및 Hibernate 5.5 에 이르는 광범위한 Hibernate 버전을 지원한다는 것입니다.
사용 중인 Hibernate 버전에 따라 다음 종속성을 추가해야 합니다.
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-63</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-55</artifactId>
<version>3.9.0</version>
</dependency>
Hypersistence Utils 프로젝트는 이를 사용하기 위해 프로젝트에서 명시적으로 선언해야 하는 선택적 종속성 목록을 정의합니다.
Guava, Jackson 또는 PostgreSQL JDBC 드라이버와 같이 이러한 모든 종속성이 선택 사항인 이유는 모든 프로젝트에 이러한 종속성이 필요할 수는 없기 때문입니다.
더욱이 종속성 버전은 때때로 최신 버전에서 해결되는 보안 문제가 발견될 수 있으므로 매우 중요합니다.
따라서 종속성 버전을 제공하기 위해 이 라이브러리에 의존하는 것은 매우 위험한 일입니다.
예를 들어, 이 프로젝트가 크게 의존하고 있는 Jackson Data Bind 라이브러리에서 65개의 보안 문제가 발견되었습니다.
보안 문제 위험을 방지하려면 Hypersistence Utils 라이브러리와 함께 사용하는 모든 종속성을 지속적으로 업그레이드해야 합니다.
JSON 유형을 사용하는 경우 Hibernate 버전을 기반으로 다음 종속성을 설정하는 데 관심이 있을 수 있습니다.
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jakarta-xmlbind-annotations</ artifactId >
< version >${jackson-module-jakarta-xmlbind-annotation}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${jackson-databind.version}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jaxb-annotations</ artifactId >
< version >${jackson-module-jaxb-annotation}</ version >
</ dependency >
Guava를 사용하여 Range
를 매핑하는 경우 Guava 종속성을 명시적으로 제공해야 합니다.
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
MonetaryAmount
를 매핑하는 경우 Monet 종속성을 명시적으로 제공해야 합니다.
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
PostgreSQL 관련 열 유형(예: inet
, hstore
, array
, interval
)을 매핑하는 경우 PostgreSQL 종속성을 명시적으로 제공해야 합니다.
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
JsonType
사용하면 Oracle, SQL Server, PostgreSQL 또는 MySQL을 사용하는지 여부에 관계없이 JSON 열 유형을 매핑할 수 있습니다.
Hibernate 6을 사용하는 경우 JSON 열을 Map
, List
, POJO, String
또는 JsonNode
엔터티 속성에 매핑할 수 있습니다.
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
Hibernate 5를 사용하는 경우 Hibernate 유형의 정규화된 이름을 제공할 수 있습니다.
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
또는 JPA 엔터티가 있는 동일한 패키지의 package-info.java
클래스에 다음 매핑을 추가할 수 있습니다.
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
나중에 다음과 같이 Map
, List
, POJO, String
또는 JsonNode
엔터티 속성을 JSON 열에 매핑할 수 있습니다.
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
자세한 내용은 이 기사를 확인하세요.
JSON 열 유형을
POJO
,List<POJO>
또는Map<String, POJO>
에 매핑할 때POJO
유형이 기본equals
및hashCode
메서드를 재정의하고 JSON 개체 콘텐츠에 따라 구현하는지 확인해야 합니다.그렇지 않으면 Hibernate 더티 검사 메커니즘이 예상치 못한 UPDATE 문을 트리거할 수 있습니다. 자세한 내용은 #134 문제를 확인하세요.
Oracle을 사용할 때 다음과 같은 몇 가지 옵션이 있습니다.
@Column
주석의 columnDefinition
속성을 사용하여 열 유형을 힌트하는 한 JSON
, VARCHAR
또는 BLOB
열 유형과 함께 작동할 수 있는 일반 JsonType
사용할 수 있습니다.JsonStringType
사용하여 JSON을 저장하는 VARCHAR2
열 유형을 매핑할 수 있습니다.JsonBlobType
을 사용하여 JSON을 저장하는 BLOB
열 유형을 매핑할 수 있습니다.자세한 내용은 이 기사를 확인하세요.
SQL Server를 사용하는 경우 일반 JsonType
또는 JsonStringType
사용하여 JSON을 저장하는 NVARCHAR
열 유형을 매핑할 수 있습니다.
자세한 내용은 이 기사를 확인하세요.
PostgreSQL을 사용하는 경우 일반 JsonType
또는 JsonBinaryType
사용하여 jsonb
및 json
열 유형을 모두 매핑할 수 있습니다.
자세한 내용은 이 기사를 확인하세요.
MySQL을 사용하는 경우 일반 JsonType
또는 JsonStringType
사용하여 json
열 유형을 매핑할 수 있습니다.
자세한 내용은 이 기사를 확인하세요.
JsonNode
JSON 열에 매핑하는 방법No Dialect mapping for JDBC type: 1111
문제column is of type jsonb but expression is of type record
또는 bytea
문제입니다. List
에 매핑하는 방법Duration
에 매핑하는 방법 MonetaryAmount
매핑하는 가장 좋은 방법java.time.YearMonth
DATE 또는 INTEGER 열에 매핑하는 방법java.time.Year
및 java.time.Month
매핑하는 방법Character
UserType
구현을 단순화하는 ImmutableType
유틸리티 findAll
안티 패턴@Retry
주석 BaseJpaRepository
는 JPA 용어로는 의미가 없는 findAll
메소드나 save
메소드를 제공하지 않기 때문에 기본 Spring Data JpaRepository
에 대한 훨씬 더 나은 대안입니다.
BaseJpaRepository
유틸리티를 사용하려면 Hypersistence Utils 프로젝트의 BaseJpaRepositoryImpl
참조하기 위해 @EnableJpaRepositories
구성에 repositoryBaseClass
속성을 제공해야 합니다.
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
your.repository.package
는 Spring 리포지토리의 Java 패키지입니다.
BaseJpaRepository
가 선호되지만 기본 JpaRepository
사용해야 하는 경우에는 최소한 HibernateRepository
를 확장하여 문제를 일으킬 수 있는 메서드를 더 이상 사용하지 않을 수 있습니다.
HibernateRepository
를 사용하려면 @EnableJpaRepositories
구성에 io.hypersistence.utils.spring.repository
패키지를 포함해야 합니다.
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
your.repository.package
는 Spring 리포지토리의 Java 패키지입니다.
BatchSequenceGenerator
- 최대 절전 모드 배치 시퀀스 생성기 CamelCaseToSnakeCaseNamingStrategy
- Hibernate를 사용하여 camelCase 속성을 snake_case 열 이름에 매핑하는 방법 ClassImportIntegrator
- JPA를 사용하여 컴팩트 DTO 프로젝션 쿼리를 작성하는 방법ListResultTransformer
- Hibernate ResultTransformer를 사용하는 가장 좋은 방법MapResultTransformer
- JPA 또는 Hibernate 쿼리에서 맵 결과를 반환하는 방법 SQLStatementCountValidator
- 테스트 중에 Hibernate N+1 쿼리 문제를 감지하는 방법 SQLExtract
- JPQL 또는 JPA 기준에서 SQL 쿼리를 가져오는 방법QueryStackTraceLogger
- Hibernate에 의해 생성된 SQL 쿼리의 소스를 찾는 방법이 프로젝트는 무료가 아닌 Libre와 마찬가지로 무료입니다.
무료 지원은 없습니다. 소스코드와 바이너리만 무료로 제공됩니다.
특정 문제에 대한 도움이 필요한 경우 Coaching Basic 또는 Coaching Pro 프로그램을 구입해야 합니다.
유료 지원 옵션 외에도 자체 수정 사항을 제공할 수 있는 옵션이 있습니다. 이를 위해 수행해야 할 작업은 다음과 같습니다.
다만, 시간이 부족하여 제출된 Pull Request를 수시로 검토해드리므로, Pull Request가 검토되어 통합될 때까지 몇 달 정도 기다리셔야 할 수도 있습니다.
JPA와 Hibernate를 적절하게 사용하고 있는지 자동으로 감지할 수 있는 도구가 있다고 상상해 보십시오. 더 이상 성능 문제가 없으며 애플리케이션이 거의 크롤링되지 않는 이유를 파악하기 위해 셀 수 없이 많은 시간을 소비할 필요가 없습니다.
최적이 아닌 매핑과 엔터티 관계를 사용하고 있거나 성능 관련 설정이 누락되어 있다는 사실을 개발 주기 초기에 발견했다고 상상해 보십시오.
또한 Hypersistence Optimizer를 사용하면 테스트 중에 이러한 모든 문제를 감지하고 데이터 액세스 계층 성능에 영향을 미치는 변경 사항을 프로덕션에 배포하지 않도록 할 수 있습니다.
Hypersistence Optimizer는 여러분이 오랫동안 기다려 왔던 도구입니다!
현장 교육에 관심이 있으신 경우 1일, 2일 또는 3일 세션에 맞춰 조정할 수 있는 고성능 Java Persistence 교육을 제공해 드릴 수 있습니다. 자세한 내용은 내 웹사이트를 확인하세요.
제가 귀하의 신청서를 검토하고 더 빠르게 실행하기 위해 최적화할 수 있는 방법에 대한 통찰력을 제공하길 원하시면 제 컨설팅 페이지를 확인해 주세요.
Java 데이터베이스 애플리케이션의 속도를 높이는 방법을 가장 빠르게 배우고 싶다면 반드시 내 고성능 Java Persistence 비디오 과정에 등록해야 합니다.
또는 책을 읽는 것을 선호한다면 내 고성능 Java Persistence 책도 좋아할 것입니다.
다양한 모듈이 다양한 Java 버전을 사용하여 컴파일되고 테스트되므로 프로젝트에서는 Maven Toolchains를 사용합니다.
Hypersistence Utils 6에는 Java 11이 필요하고 다른 모듈은 Java 8로 컴파일됩니다.
Maven Toolchains를 구성하는 방법을 보려면 이 문서를 확인하세요.
프로젝트는 통합 테스트를 위해 다양한 데이터베이스 시스템을 사용하고 DatasourceProvider
인스턴스(예: PostgreSQLDataSourceProvider
)를 사용하여 JDBC 연결 설정을 구성할 수 있으며 프로젝트는 Testcontainers를 사용하여 필요한 Oracle, SQL Server, PostgreSQL 또는 MySQL로 Docker 컨테이너를 부트스트랩합니다. 요청 시 인스턴스.
정기적으로 기여하는 경우 필요한 데이터베이스를 로컬로 설정하거나
docker
폴더에 제공된 Docker Compose 구성을 사용하는 것이 좋습니다. 요청 시 컨테이너 부트스트랩이 느리고 테스트 실행 시간이 더 오래 걸리기 때문입니다.
문제를 해결하거나 새로운 기능에 대한 지원을 추가하려면 개선 사항이 예상대로 작동함을 입증하는 관련 통합 테스트 사례를 제공해 주세요.