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

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

Ответ 1

В Hibernate 5.x добавлены/улучшены некоторые интересные функции. Быстро посмотрите.

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

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

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

Для получения дополнительной информации о Hibernate Search просмотрите это.

2. Hibernate Validator

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

Экспресс-правила валидации стандартизированным способом с использованием ограничений на основе аннотаций и преимущества прозрачной интеграции с широким спектром фреймворков.

Подробнее о Hibernate Validator см. это.

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

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

4. Hibernate OGM

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

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

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


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

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

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

Ответ 2

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

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

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

  • Java 8 Типы даты и времени поддерживаются в сопоставлениях модели домена. Сопоставление между стандартными типами SQL Date/Time и поддерживаемыми типами классов Java/Date 8 Time выглядит следующим образом:

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

    • Lazy initialization: поля могут быть объявлены как LAZY, и они будут извлекаться только при первом доступе.

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

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

  • Настраиваемые API-интерфейсы Hibernate (Session и т.д.) были обновлены, чтобы использовать общие типы. Не нужно бросать при извлечении сущностей.

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

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

  • Начиная с Hibernate 5.0, у нас есть полностью новое руководство пользователя, которое было написано с нуля.

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

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

Ответ 3

В Hibernate 5 есть 5 новых функций

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5. @Repeable аннотации

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

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

Creadit/Source: https://www.thoughts-on-java.org/5-new-features-hibernate-5-every-developer-know/