Название проекта было изменено с Hibernate Types на Hypersistence Utils, поскольку сфера применения проекта теперь намного шире и включает в себя также утилиты Spring.
По этой причине при переходе с 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, от Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 до 6.2 , 6.1 , 6.0 , 5.6 и Hibernate 5.5 .
В зависимости от используемой вами версии 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 Driver, являются необязательными, заключается в том, что они могут понадобиться не всем проектам.
Более того, версия зависимости чрезвычайно важна, поскольку время от времени могут обнаруживаться проблемы безопасности, которые исправляются в более новых версиях.
Поэтому полагаться на эту библиотеку для предоставления вам версий зависимостей — очень опасно.
Например, в библиотеке 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 >
Если вы сопоставляете Range
с помощью Guava, вам необходимо явно указать зависимость Guava:
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
Если вы сопоставляете MonetaryAmount
, вам необходимо явно указать зависимость Moneta:
< 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
позволяет сопоставлять типы столбцов JSON независимо от того, используете ли вы Oracle, SQL Server, PostgreSQL или MySQL.
Если вы используете 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")
Или вы можете добавить следующее сопоставление в класс package-info.java
в том же пакете, где расположены ваши объекты JPA:
@ 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 у вас есть несколько вариантов:
JsonType
, который может работать с типами столбцов JSON
, VARCHAR
или BLOB
, если вы указываете тип столбца с помощью атрибута columnDefinition
аннотации JPA @Column
.JsonStringType
для сопоставления типа столбца VARCHAR2
хранящего JSON.JsonBlobType
для сопоставления типа столбца BLOB
, хранящего JSON.Для получения более подробной информации ознакомьтесь с этой статьей.
При использовании SQL Server вы можете использовать универсальный JsonType
или JsonStringType
для сопоставления типа столбца NVARCHAR
хранящего JSON.
Для получения более подробной информации ознакомьтесь с этой статьей.
При использовании PostgreSQL вы можете использовать общий JsonType
или JsonBinaryType
для сопоставления типов столбцов jsonb
и json
.
Для получения более подробной информации ознакомьтесь с этой статьей.
При использовании MySQL вы можете использовать общий JsonType
или JsonStringType
для сопоставления типа столбца json
.
Для получения более подробной информации ознакомьтесь с этой статьей.
JsonNode
со столбцом JSONNo Dialect mapping for JDBC type: 1111
при смешивании типов JSON с собственными запросами SQLcolumn is of type jsonb but expression is of type record
или проблему bytea
List
Java с помощью JPA и HibernateDuration
Java с помощью Hibernate MonetaryAmount
с помощью JPA и Hibernatejava.time.YearMonth
со столбцом DATE или INTEGERjava.time.Year
и java.time.Month
с помощью JPA и HibernateCharacter
в столбец CHAR, допускающий значение NULLImmutableType
для упрощения реализации UserType
findAll
@Retry
для автоматического повтора попытки в случае неудачи. BaseJpaRepository
является гораздо лучшей альтернативой стандартному JpaRepository
Spring Data, поскольку он не предоставляет метод findAll
или метод save
, который не имеет смысла в терминологии JPA.
Чтобы использовать утилиту BaseJpaRepository
, убедитесь, что вы указали атрибут repositoryBaseClass
в конфигурации @EnableJpaRepositories
для ссылки на BaseJpaRepositoryImpl
из проекта Hypersistence Utils:
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
your.repository.package
— это пакет Java ваших репозиториев Spring.
Хотя BaseJpaRepository
является предпочтительным, в случае, если вам нужно использовать JpaRepository
по умолчанию, вы можете, по крайней мере, расширить HibernateRepository
, чтобы исключить методы, которые могут вызвать проблемы.
Чтобы использовать HibernateRepository
, убедитесь, что вы включили пакет io.hypersistence.utils.spring.repository
в свою конфигурацию @EnableJpaRepositories
:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
your.repository.package
— это пакет Java ваших репозиториев Spring.
BatchSequenceGenerator
— Генератор пакетных последовательностей в спящем режиме CamelCaseToSnakeCaseNamingStrategy
— Как сопоставить свойства CamelCase с именами столбцов Snake_case с помощью Hibernate ClassImportIntegrator
— Как написать компактный запрос проекции DTO с помощью JPAListResultTransformer
— лучший способ использовать Hibernate ResultTransformerMapResultTransformer
— как вернуть результат карты из запроса JPA или Hibernate SQLStatementCountValidator
— как обнаружить проблему запроса Hibernate N+1 во время тестирования SQLExtract
– Как получить SQL-запрос из критериев JPQL или JPAQueryStackTraceLogger
— Как найти источник SQL-запроса, сгенерированного HibernateЭтот проект бесплатный, как и в случае с Libre, а не Gratis.
Бесплатная поддержка отсутствует. Бесплатно доступны только исходный код и двоичные файлы.
Если вам нужна помощь по определенному вопросу, вам необходимо приобрести программы Coaching Basic или Coaching Pro.
Помимо вариантов платной поддержки, у вас есть возможность предоставить собственное исправление. Для этого вот что вам нужно сделать:
Однако из-за нехватки времени я буду время от времени просматривать отправленные запросы на включение, поэтому вам, возможно, придется подождать несколько месяцев, пока запрос на включение не будет рассмотрен и интегрирован.
Представьте себе, что у вас есть инструмент, который может автоматически определять, правильно ли вы используете JPA и Hibernate. Больше никаких проблем с производительностью и необходимости тратить бесчисленные часы, пытаясь выяснить, почему ваше приложение почти не сканирует.
Представьте себе, что на раннем этапе цикла разработки вы обнаруживаете, что вы используете неоптимальные сопоставления и связи сущностей или что вам не хватает настроек, связанных с производительностью.
Более того, с помощью Hypersistence Optimizer вы можете обнаружить все подобные проблемы во время тестирования и убедиться, что вы не развернете в рабочей среде изменения, которые повлияют на производительность уровня доступа к данным.
Hypersistence Optimizer – это инструмент, которого вы так долго ждали!
Если вы заинтересованы в обучении на месте, я могу предложить вам обучение High-Performance Java Persistence, которое можно адаптировать к одному, двум или трем дням занятий. Для более подробной информации посетите мой сайт.
Если вы хотите, чтобы я рассмотрел ваше приложение и дал представление о том, как его оптимизировать для более быстрой работы, посетите мою страницу консультаций.
Если вам нужен самый быстрый способ узнать, как ускорить работу приложения базы данных Java, вам обязательно следует записаться на мои видеокурсы по высокопроизводительному сохранению Java.
Или, если вы предпочитаете читать книги, вам также понравится моя книга «High-Performance Java Persistence».
В проекте используются цепочки инструментов Maven, поскольку разные модули компилируются и тестируются с использованием разных версий Java.
Для Hypersistence Utils 6 требуется Java 11, тогда как другие модули скомпилированы с использованием Java 8.
Чтобы узнать, как настроить цепочки инструментов Maven, прочтите эту статью.
В проекте используются различные системы баз данных для интеграционного тестирования, и вы можете настроить параметры соединения JDBC с помощью экземпляров DatasourceProvider
(например, PostgreSQLDataSourceProvider
), а проект использует Testcontainers для загрузки контейнера Docker с необходимым Oracle, SQL Server, PostgreSQL или MySQL. экземпляр по требованию.
Если вы являетесь постоянным участником, рекомендуется настроить необходимую базу данных локально или использовать конфигурацию Docker Compose, предоставленную в папке
docker
, поскольку загрузка контейнеров по требованию происходит медленнее, и выполнение ваших тестов займет больше времени.
Если вы хотите устранить проблему или добавить поддержку новой функции, предоставьте соответствующий тестовый пример интеграции, который доказывает, что улучшение работает должным образом.