Что нового в Hibernate ORM 5?

Я только что увидел, что четвертого кандидата выпустили в Hibernate 5. Что нового в 5 по сравнению с более ранними версиями?

3 ответа

Решение

Некоторые интересные функции были добавлены / улучшены в Hibernate 5.x. Быстро взгляни.

1. Поиск в спящем режиме

Hibernate Search прозрачно индексирует ваши объекты и предлагает быстрый регулярный полнотекстовый поиск и поиск по геолокации. Простота использования и простота кластеризации являются основными.

  • Полнотекстовый поиск объектов - поиск по приближению (нечеткий поиск)
  • Cluster-friendly - предлагает несколько простых в настройке стратегий кластеризации
  • Гранение и геолокация - геолокационные объекты так же просты, как @Spatial

Более подробную информацию о Hibernate Search можно найти здесь.

2. Спящий валидатор

Hibernate Validator поставляется с несколькими встроенными правилами проверки, такими как Email, Length, NotBlank и т. Д.

Выражайте правила проверки стандартизированным способом, используя ограничения на основе аннотаций, и извлекайте выгоду из прозрачной интеграции с широким спектром платформ.

Для более подробной информации о Hibernate Validator посмотрите это.

3. Улучшена поддержка Java 8

Поддерживаются типы данных даты / времени Java 8 (JSR 310), которые можно проверять с помощью @Past и @Future. Кроме того, типы Optional и JavaFX поддерживаются с помощью улучшенного ValidatedValueUnwrapper.

4. Hibernate OGM

Только что выпустили первую стабильную версию.

5. API начальной загрузки

Новый API начальной загрузки - лучший детерминизм, лучшая интеграция


Несколько других вещей:

  • Поддержка сканирования для использования не JPA
  • NamingStrategy была удалена в пользу лучшего разработанного API
  • Возможность обрабатывать дополнительные типы Java для атрибутов id, помеченных как GenerationType#AUTO. Встроенная поддержка номера и UUID. Расширяется с помощью нового расширения org.hibernate.boot.model.IdGeneratorStrategyInterpreter.
  • Кроме того, поддержка AttributeConverters была расширена и более полно реализована

Проверьте Hibernate ORM Roadmap для более подробной информации.

Есть длинный список вещей, которые были изменены в Hibernate 5:

  1. Новый API начальной загрузки, поэтому мы можем программно загрузить среду JPA без необходимости persistence.xml файл

  2. Начиная с версии 5.0, Hibernate Spatial является частью проекта Hibernate, поэтому мы также можем обрабатывать ГИС-данные.

  3. Типы даты и времени Java 8 поддерживаются в отображениях модели домена. Отображение между стандартными типами даты и времени SQL и поддерживаемыми типами классов даты и времени Java 8 выглядит следующим образом;

    • ДАТА: java.time.LocalDate
    • ВРЕМЯ: java.time.LocalTime, java.time.OffsetTime
    • TIMESTAMP: java.time.Instant, java.time.LocalDateTime, java.time.OffsetDateTime а также java.time.ZonedDateTime
  4. Механизм улучшения байт-кода был переработан с нуля, и в Hibernate есть и плагин Maven, и Gradle. Есть три основных аспекта, которые мы можем улучшить с помощью инструментов байт-кода:

    • Ленивая инициализация: поля могут быть объявлены как LAZY и они будут получены только при первом обращении.

    • Грязная проверка: объекты улучшены, так что они могут отслеживать все свойства, которые изменяются после загрузки в контексте постоянства.

    • Двунаправленные ассоциации: можно автоматически синхронизировать обе стороны двунаправленной ассоциации, даже если разработчик обновляет только одну сторону.

  5. Родные API Hibernate (Session и т. д.) были обновлены для использования универсальных типов. Нет необходимости разыгрывать при получении сущностей.

  6. Hibernate 5.0 расширяет это для более широкого набора типов (например, UUID).

  7. Кэш второго уровня по ссылке. Эта функция позволяет напрямую сохранять ссылки на сущности в кэш второго уровня для неизменяемых сущностей.

  8. Начиная с Hibernate 5.0, у нас есть совершенно новое руководство пользователя, написанное с нуля.

Hibernate 5.1 добавляет следующие функции:

  1. Теперь вы можете объединять несвязанные объекты в запросах JPQL и HQL.
  2. Загрузка нескольких объектов по идентификатору

Hibernate 5.2 добавляет поддержку для:

  1. Java 1.8, так что теперь вы можете использовать Query.stream()
  2. Спящий Session продолжается EntityManager так что вы можете получить доступ ко всем методам JPA прямо из Session
  3. Поддержка JCache
  4. Размер пакета на уровне сеанса
  5. Глобальная настройка часового пояса (например, UTC) для Timestamp а также Time
  6. Отличительный сквозной намек
  7. Более эффективный анализ константных значений в JPQL и HQL
  8. hibernate.connection.provider_disables_autocommit ресурсно-локальная оптимизация транзакций.
  9. Лучшая обработка литералов Criteria API.

В Hibernate 5 появилось 5 новых функций

1. Поддержка классов API даты и времени как BasicTypes. Новый API даты и времени был одним из самых ожидаемых изменений в Java 8. В старом java.util.Date было много проблем, которые были окончательно исправлены.

К сожалению, JPA 2.1 и Hibernate 4 не обеспечивают его прямой поддержки. Но это не большая проблема. Для реализации AttributeConverter, отображающего LocalDate, требуется всего несколько строк кода.

Но очевидно, что явная поддержка BasicType все же намного лучше. Hibernate реализовал это в версии 5.0. С тех пор вам не нужны никакие дополнительные аннотации или конвертер для сохранения классов API даты и времени. Вы можете использовать их так же, как и любые другие поддерживаемые типы атрибутов.

2. Получите результаты запроса в виде потока. Представление нового метода, обеспечивающего получение результата запроса в виде потока, не кажется большой вещью. Но потоковый метод интерфейса запросов Hibernate обеспечивает дополнительное преимущество, которое делает его особенно интересным для огромных наборов результатов. Он выбирает набор результатов в нескольких пакетах и ​​использует реализацию ScrollableResults от Hibernate, чтобы прокрутить его. Этот подход очень удобен, если вы используете Stream для обработки записей набора результатов одна за другой и помогает вам эффективно реализовать ваш вариант использования.

Вы можете использовать новый метод, начиная с Hibernate 5.2, чтобы получить результаты запроса. В следующем фрагменте кода показан простой пример, который выбирает все сущности Book из базы данных и обрабатывает их как поток.

3. Получить несколько объектов по их первичному ключу

Выборка нескольких объектов по их идентификатору является очень распространенным случаем использования. Большинство разработчиков реализуют его либо с помощью цикла, который вызывает метод find объекта EntityManager для каждого первичного ключа, либо с помощью запроса JPQL, который проверяет все значения первичного ключа в предложении IN. Первый вариант требует, чтобы Hibernate выполнял запрос к базе данных для каждого первичного ключа. Это может создать огромные проблемы с производительностью. Второй позволяет выбрать все объекты одним запросом и, очевидно, является лучшим вариантом.

В Hibernate 5.1 введена третья опция, которая позволяет избежать проблем с первой и проще в использовании, чем вторая. Новый интерфейс MultiIdentifierLoadAccess предоставляет удобную опцию для загрузки нескольких объектов одним запросом. Вам просто нужно вызвать метод byMultipleIds в Hibernate Session, чтобы получить интерфейс MultiIdentifierLoadAccess и предоставить список значений первичного ключа для метода multiLoad. Реализация Hibernate также обеспечивает дополнительное преимущество: она разбивает огромные списки значений первичных ключей на несколько пакетов. Это иногда требуется, потому что некоторые базы данных ограничивают количество элементов в предложении IN.

4. Присоединяйте неассоциированные объекты в запросе

Вы можете легко объединить сопоставленные ассоциации между сущностями в запросах JPQL. Сопоставление уже обеспечивает необходимые условия соединения, и вам не нужно указывать их в запросе.

Но как насчет сущностей, которые отображают связанные таблицы базы данных, но не имеют сопоставленной ассоциации?

И это не риторический вопрос.

Большинство моделей сущностей не отображают все возможные ассоциации. Они отображают только те, которые, по-видимому, дают значение в модели предметной области, а не те, в которых 2 таблицы базы данных (казалось бы, случайно) хранят один и тот же внешний ключ. Также часто случается, что связь многих со многими записями на многих сторонах не отображается в Hibernate. Риск того, что кто-то позвонит получателю ассоциации и выберет несколько сотен или тысяч объектов, слишком высок.

Это совершенно нормально, если вы просто посмотрите на модель предметной области. Вам, вероятно, не нужны эти ассоциации в модели. Но это не значит, что они вам не нужны ни в одном из ваших запросов JPQL.

Если это так, у вас есть 3 варианта:

1 Смоделируйте связь между сущностями или
2 Используйте перекрестное соединение в своем запросе JPQL, что может привести к проблемам с производительностью или
3 Используйте запатентованное предложение JOIN Hibernate. Я предпочитаю вариант 3. Это самый простой и самый естественный вариант.

Начиная с Hibernate 5.1, вы можете использовать SQL-подобный синтаксис для объединения сущностей без смоделированной ассоциации.

5. @ Повторяющиеся аннотации

Повторяющиеся аннотации являются одним из самых мелких изменений в Java 8. Он позволяет аннотировать класс, атрибут или интерфейс одной и той же аннотацией несколько раз. Типичный пример JPA, в котором вы хотите сделать это - определение нескольких именованных запросов для объекта.

До сих пор вам приходилось аннотировать вашу сущность аннотацией @NamedQueries, которая содержала массив аннотаций @NamedQuery. Раздражает то, что аннотация @NamedQueries - это просто контейнер. Сам по себе он не дает никакой ценности. Начиная с Hibernate 5.2, вам больше не нужно этого делать. По крайней мере, до тех пор, пока вы используете версию аннотации org.hibernate.annotations.NamedQuery от Hibernate. @NamedQuery и многие другие аннотации Hibernate теперь повторяются и могут назначаться несколько раз. Как вы можете видеть в следующем фрагменте кода, это облегчает чтение кода и делает его более удобным в использовании.

Creadit / Источник: https://www.thoughts-on-java.org/5-new-features-hibernate-5-every-developer-know/

Другие вопросы по тегам