Основы hibernate в java

Entity Definition

Now that we’ve gone through the basics, let’s define some entities. If we worked with Hibernate ORM or JPA before, this has nothing more to add. This is the fundamental premise of Hibernate OGM. It promises to let us work with different NoSQL datastores with just the knowledge of JPA.

For this tutorial, we’ll define a simple object model:

It defines Article, Author and Editor classes along with their relationships.

Let’s also define them in Java:

We’ve now defined entity classes and annotated them with JPA standard annotations:

  • @Entity to establish them as JPA entities
  • @Id to generate primary keys for the entities with UUIDs
  • @OneToMany and @ManyToOne to establish bidirectional relationships between the entities

Применение

Разработка объектно-ориентированного программного обеспечения, которое работает с данными из реляционных баз данных, может быть громоздкой и ресурсоемкой. Затраты на разработку значительно выше из-за несоответствия парадигмы представления данных в объектах по сравнению с реляционными базами данных. Hibernate — это решение объектно-реляционного сопоставления (ORM) для сред Java. ORM относится к технике отображения данных между представлением объектной модели и представлением реляционной модели данных.

Hibernate не только заботится о сопоставлении классов Java с таблицами базы данных (и от типов данных Java к типам данных SQL), но также предоставляет средства для запроса и извлечения данных. Это может значительно сократить время разработки, затрачиваемое на ручную обработку данных в SQL и JDBC. Целью разработки Hibernate является избавление разработчика от 95% распространенных задач программирования, связанных с сохранением данных, за счет исключения необходимости ручной обработки данных вручную с использованием SQL и JDBC. Тем не менее, в отличие от многих других персистентных решений, Hibernate не скрывает от вас всю мощь SQL и гарантирует, что ваши инвестиции в реляционные технологии и знания столь же эффективны, как и всегда.

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

Setup

For this tutorial, we’ll use Maven to pull the required dependencies to work with Hibernate OGM. We’ll also use MongoDB.

To clarify, let’s see how to set them up for the tutorial.

3.1. Maven Dependencies

Let’s see the dependencies required to work with Hibernate OGM and MongoDB:

Here we’re pulling required dependencies through Maven:

  • Hibernate OGM dialect for MongoDB
  • Narayana Transaction Manager (actual provider of the JTA)

3.2. Persistence Unit

We’ll also have to define datastore details in the Hibernate persistance.xml:

Note the definitions we’ve provided here:

  • the value of attribute transaction-type as “JTA” (this implies that we want a JTA entity manager from the EntityManagerFactory)
  • the provider, which is HibernateOgmPersistence for Hibernate OGM
  • a few additional details related to the DB (these typically vary between different data sources)

The configuration assumes MongoDB is running and accessible on defaults. If this is not the case, we can always . One of our previous articles also covers setting up MongoDB in detail.

What’s new

Latest release announcement (2018-09-10):

5.6.6.Final.

A detailed list of new features, improvements and fixes in this series can be found

on our JIRA instance.

Experimental Elasticsearch integration

A new, experimental Elasticsearch integration was introduced in this series.

With the Elasticsearch integration, rather than indexing your entities directly by managing the Lucene resources,
Hibernate Search will be sending RPCs to an Elasticsearch cluster to achieve a very similar purpose:
after all it is also Lucene based, so the feature match is extremely close!

Since Hibernate Search will transparently map all the current features to this new alternative backend,
you will be able to switch to a new architecture with only minimal changes in your applications.
For most users the differences will be mostly in configuration details.

When using Elasticsearch, Hibernate Search will need to send RPCs over the network
to run queries and index updates,
but on the other hand you benefit from Microservices — style decoupling and all the nice features
that Elasticsearch can provide in terms of running and managing an horizontally scalable cluster.

To know more about this integration, check out the

in the documentation.

Sort DSL

The QueryBuilder interface now has an additional method,
allowing to easily build sort definitions regardless of the underlying technology
(raw Lucene or Elasticsearch),
and without worrying about numeric field types:

You can find more information in
this blog post
and in

Lucene upgrade

The Lucene dependency was upgraded to 5.5.

Also, do not think Lucene was forgotten in this series,
since there were several bug fixes and performance improvements.
See the release notes for details.

Async reader strategy

A new reader strategy has been added for the Lucene integration,
bringing performance boosts when you are okay with your queries being run
on an out-of-date index (how much out-of-date is configurable).

Refer to
for more information.

Проблемы отображения объектной модели в реляционную

Проблема 1. Наследование и полиморфные запросы.

  1. Все наследники лежат в одной таблице:@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    В этом случае, общие поля и поля наследников лежат в одной таблице. Используя такую стратегию мы избегаем join-ов при выборе сущностей. Из минусов стоит отметить, что во-первых, мы не можем в реляционной модели задать “NOT NULL” ограничение для колонки “force” и во-вторых, мы теряем третью нормальную форму. (появляется транзитивная зависимость неключевых атрибутов: force и disc).
    Кстати, в том числе и по этой причине есть 2 способа указать not null ограничение у поля — NotNull отвечает за валидацию; @Column(nullable = true) — отвечает за not null ограничение в базе данных.
    На мой взгляд это лучший вариант отображения объектной модели в реляционную.
  2. Специфичные для сущности поля лежат в отдельной таблице.@Inheritance(strategy = InheritanceType.JOINED)
    В этом случае общие поля хранятся в общей таблице, а специфичные для дочерних сущностей — в отдельных. Используя эту стратегию у нас появляется JOIN при выборе сущности, но теперь мы сохраняем третью нормальную форму, а также можем указать NOT NULL ограничение в базе данных.
  3. Для каждой сущности есть своя таблица@InheritanceType.TABLE_PER_CLASS
    В этом случае у нас нет общей таблицы. Используя эту стратегию, при полиморфных запросах мы используется UNION. У нас появляеются проблемы с генераторами первичных ключей и другими ограничениями целостности. Данный тип отображения наследования строго не рекомендуется использовать.

How to get it

Maven, Gradle…

Maven artifacts of Hibernate Search are published to

Maven Central

and to the

JBoss Maven repository.

Refer to the
Maven Getting Started guide
on the JBoss Wiki for more information on how to configure the JBoss Maven repository.

You can find the Maven coordinates of all artifacts through the link below:

Below are the Maven coordinates of the main artifacts.

Hibernate ORM integration
Elasticsearch integration
JGroups backend
JMS backend

Zip archive

Direct download is available from SourceForge:

More information about specific releases (announcements, download links) can be found

Hibernate — пакетная обработка

2.1. Изменения в конфигурационном файле

Для того, чтобы включить пакетную обработку, необходимо добавить свойство hibernate.jdbc.batch_size в конфигурационный файл Hibernate.cfg.xml и указать размер пакета. Hibernate будет накапливать пакет SQL выражениями INSERT, UPDATE, DELETE на уровне JDBC и отправлять в БД. А так же при выполнении смешанных SQL выражений для более эффективного накопления на уровне JDBC необходимо добавить в конфигурационный файл такие свойства hibernate.order_inserts, hibernate.order_updates и установить их в true, Hibernate отсортирует операции перед созданием пакета SQL выражений. Необходимость сортировки SQL выражений для большей эффективности обусловлена тем, что на уровне JDBC Hibernate использует метод addBatch() интерфейса PreparedStatement, который не предусматривает возможности собирать в один пакет разные SQL операторы.

Пример Hibernate.cfg.xml

2.2. Примеры реализации пакетной обработки

Прежде чем перейти к примерам реализации обратим внимание на некоторые аспекты связанные с контекстом хранения. Как известно, контекст хранения служит кэшем хранимых экземпляров

При попытке загрузить тысячи экземпляров сущностей, Hibernate сделает копию каждого экземпляра в кэше контекста хранения, что может привести к исчерпанию памяти OutOfMemoryException. Есть 2 варианта предотвращения полного расходования памяти:

  1. Периодический вызов методов flush() и clear() для очистки контекста хранения.

    Пример:

Common Java related tasks

  • build — Assembles (jars) and tests this project
  • buildDependents — Assembles and tests this project and all projects that depend on it. So think of running this in hibernate-core, Gradle would assemble and test hibernate-core as well as hibernate-envers (because envers depends on core)
  • classes — Compiles the main classes
  • testClasses — Compiles the test classes
  • compile (Hibernate addition) — Performs all compilation tasks including staging resources from both main and test
  • jar — Generates a jar archive with all the compiled classes
  • test — Runs the tests
  • publish — Think Maven deploy
  • publishToMavenLocal — Installs the project jar to your local maven cache (aka ~/.m2/repository). Note that Gradle
    never uses this, but it can be useful for testing your build with other local Maven-based builds.
  • eclipse — Generates an Eclipse project
  • idea — Generates an IntelliJ/IDEA project (although the preferred approach is to use IntelliJ’s Gradle import).
  • clean — Cleans the build directory

Преимущества

  • Легкий и открытый исходный код.
  • Повышенная производительность — использование кэш-памяти помогает повысить производительность.
  • Независимость базы данных — независимость от базы данных дает ему возможность работать с разными базами данных.
  • Auto DDL Operations — автоматическое создание таблиц избавляет нас от ручного создания таблиц.
  • Заботится о сопоставлении баз данных классов Java с использованием файлов XML без написания кода.
  • Мы можем напрямую хранить и извлекать данные прямо из базы данных с помощью простых API.
  • Для работы не требуется сервер приложений.
  • Минимизирует доступ к базе данных с помощью интеллектуальных стратегий выборки.
  • Обеспечивает простой запрос данных.

How to get it

Maven, Gradle…

Maven artifacts of Hibernate OGM are published to

Maven Central

and to the

JBoss Maven repository.

Refer to the
Maven Getting Started guide
on the JBoss Wiki for more information on how to configure the JBoss Maven repository.

You can find the Maven coordinates of all artifacts through the link below:

Below are the Maven coordinates of the main artifacts.

Infinispan integration (embedded)
MongoDB integration
Neo4j integration
CouchDB integration
Cassandra integration
Ehcache integration
Redis integration

Zip archive

Direct download is available from SourceForge:

More information about specific releases (announcements, download links) can be found

Releases in this series

5.0.12.Final

2017-01-19

Download

Resolved issues

Release announcement

5.0.11.Final

2016-09-19

Download

Resolved issues

Release announcement

5.0.10.Final

2016-07-31

Download

Resolved issues

Release announcement

5.0.9.Final

2016-03-14

Download

Resolved issues

Release announcement

5.0.8.Final

2016-02-17

Download

Resolved issues

Release announcement

5.0.7.Final

2016-01-13

Download

Resolved issues

Release announcement

5.0.6.Final

2015-12-16

Download

Resolved issues

Release announcement

5.0.5.Final

2015-12-02

Download

Resolved issues

Release announcement

5.0.4.Final

2015-11-18

Download

Resolved issues

Release announcement

5.0.2.Final

2015-09-30

Download

Resolved issues

Release announcement

5.0.1.Final

2015-09-03

Download

Resolved issues

Release announcement

5.0.0.Final

2015-08-20

Download

Resolved issues

Release announcement

5.0.0.CR4

2015-08-05

Download

Resolved issues

Release announcement

5.0.0.CR3

2015-07-29

Download

Resolved issues

Release announcement

5.0.0.CR2

2015-07-08

Download

Resolved issues

Release announcement

5.0.0.CR1

2015-05-27

Download

Resolved issues

Release announcement

5.0.0.Beta2

2015-04-29

Download

Resolved issues

Release announcement

5.0.0.Beta1

2015-03-31

Download

Resolved issues

Release announcement

Замена одностороннего @OneToMany на двустороннее @OneToMany + @ManyToOne

Итак, добавим поле topic в класс Comment:

@Entity
public class GoodComment {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    private String text;

    @ManyToOne(fetch = FetchType.LAZY)
    private GoodTopic topic;
    
   //getters/setters/constructors 

}

И сделаем коллекцию не основной стороной с помощью mappedBy. Также уберем JoinColumn, он тут не нужен:

@Entity
public class GoodTopic {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    private String title;
    @OneToMany(mappedBy = "topic", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<GoodComment> comments=new ArrayList<>();
   
    public void addComment(GoodComment comment) {
        comments.add(comment);
        comment.setTopic(this);
    }

    public void removeComment(GoodComment comment) {
        comments.remove(comment);
        comment.setTopic(null);
    }

   //getters/setters/constructors
}

Обратите внимание, что добавлены методы addComment()  и removeComment(), в них поддерживается согласованность двустороннего отношения. Теперь при выполнении аналогичных тестов лишних операторов update нет:

Теперь при выполнении аналогичных тестов лишних операторов update нет:

@DataJpaTest
public class GoodStructureTest {
    @Autowired
    private GoodTopicRepository topicRepository;
    @Autowired
    private GoodCommentRepository commentRepository;

    @Test
    @DisplayName("при добавлении топика для каждого комментария выполняется один insert")
    public void whenAddTopicWithComments_thenInsertsWithUpdates() {
        GoodTopic topic = new GoodTopic("title");
        topic.addComment(new GoodComment("c1"));
        topic.addComment(new GoodComment("c2"));
        topic.addComment(new GoodComment("c3"));
        topic = topicRepository.save(topic);

        Assertions.assertEquals(4, topicRepository.count());
    }

    @Test
    @DisplayName("при удалении комментария для него выполняется один delete")

    public void whenDeleteComment_thenDeleteWithUpdate() {
       GoodTopic topic = topicRepository.getOne(-11l);
       topic.removeComment(topic.getComments().get(0));

       Assertions.assertEquals(2, commentRepository.count());
    }
}

Персистентность

Коллекции объектов данных, как правило, хранятся в виде коллекций Java-объектов, таких, как набор (Set) и список (List). Поддерживаются обобщенные классы (Generics), введеные в Java 5. Hibernate может быть настроен на «ленивые» (отложенные) загрузки коллекций. Отложенные загрузки является вариантом по умолчанию, начиная с Hibernate 3.

Связанные объекты могут быть настроены на каскадные операции. Например, родительский класс Album (музыкальный альбом) может быть настроен на каскадное сохранение и/или удаление своего потомка Track. Это может сократить время разработки и обеспечить целостность. Функция проверки изменения данных (dirty checking) позволяет избежать ненужной записи действий в базу данных, выполняя SQL-обновление только при изменении полей персистентных объектов.

Успех библиотеки Hibernate подтолкнул JCP к разработке спецификации JDO, ставшей одной из стандартных технологий ORM на платформе JavaEE. Также Hibernate совместима с JSR-220/317 и предоставляет стандартные средства JPA.

Documentation per Series

6.0

6.0.0.CR1
2020-11-03

development

API overhaul, more powerful bridges, smarter automatic indexing, nested documents, Lucene 8, Elasticsearch 7.

Reference

HTML

PDF

API (JavaDoc)

Getting started guide

Migration guide

HTML

PDF

5.11

5.11.5.Final
2020-02-19

stable

ORM 5.4 compatibility, JDK11 compatibility, upgrade to WildFly 17.

Reference

HTML

PDF

API (JavaDoc)

Getting started guide

HTML

Migration guide

HTML

5.10

5.10.9.Final
2020-02-19

stable

ORM 5.3 and JPA 2.2 compatibility, integration to DI frameworks through Hibernate ORM 5.3, upgrade to WildFly 17 and JGroups 4, JPMS automatic module names.

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.9

5.9.3.Final
2018-09-10

stable

JSR 352 (Batch for Java) mass indexing job, WildFly feature packs, improvements and deprecations paving the road to Search 6

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.8

5.8.2.Final
2017-10-26

stable

Experimental integration with Elasticsearch 5.x, AWS integration, improvements and deprecations paving the road to Search 6

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.7

5.7.3.Final
2017-10-26

stable

Improved integration with Elasticsearch 2.x, compatible with Hibernate ORM 5.2.x

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.6

5.6.6.Final
2018-09-10

stable

Introduces experimental support for Elasticsearch, last release supporting Hibernate ORM 5.0.z or 5.1.z

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.5

5.5.8.Final
2017-08-16

stable

Being maintained as it’s included in WildFly. Supports Lucene only, requires Hibernate ORM 5.0.z or 5.1.z

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.4

5.4.0.Final
2015-09-03

stable

Requires Hibernate ORM 5.0.0.Final; Last version compatible with Apache Lucene 4.x

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.3

5.3.0.Final
2015-06-10

stable

Improved Faceting

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.2

5.2.1.Final
2015-09-04

stable

Multi-tenancy, optimisations in criteria based loaders

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.1

5.1.2.Final
2015-04-24

stable

Upgrade to Lucene 4 and much much more …

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

5.0

5.0.1.Final
2015-01-12

stable

Upgrade to Lucene 4 and much much more …

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

4.5

4.5.3.Final
2015-01-12

stable

Performance, WildFly 8 compatibility, JPA 2.1 / Hibernate ORM 4.3 compatibility

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

4.4

4.4.6.Final
2014-12-02

stable

Dynamic index sharding, new Metadata API, Hibernate ORM 4.2.x compatible

Reference

HTML

PDF

API (JavaDoc)

Migration guide

HTML

Books and Articles

Hibernate Search in Action

A bit outdated book on Hibernate Search but a very good reference on the product and search engines in general.
It has been written by members of the Hibernate Search team.

Тестирование

  • Логирование
    • org.hibernate.SQL: debug
    • org.hibernate.type.descriptor.sql: trace
  • Статистика
  • DBUnit — позволяет описывать состояние БД в XML формате. Иногда бывает удобно. Но лучше еще раз подумайте надо ли оно вам.
  • DataSource-proxy
    • p6spy — одно из самых старых решений. предлагает расширенное логирование запросов, время выполнения, итд
    • com.vladmihalcea:db-util:0.0.1 — удобная утилита для поиска N+1 проблем. Также она позволяет логировать запросы. В состав входит интересная аннотация Retry, которая повторяет попытку выполнить транзакцию в случае OptimisticLockException.
    • Sniffy — позволяет сделать assert на количество запросов через аннотацию. В некотором плане изящнее, чем решение от Влада.

Set, Bag, List

  • Set — неупорядоченное множество сущностей без повторений;
  • Bag — неупорядоченное множество сущностей;
  • List — упорядоченное множество сущностей.
  • Если ваша версия hibernate ниже 5.0.8, то существует довольно серьезный баг — HHH-5855 — при инсерте дочерней сущности возможно ее дублирование (в случае cascadType=MERGE and PERSIST);
  • Если вы используете bag для отношения ManyToMany, то hibernate генерирует крайне не оптимальные запросы при удалении сущности из коллекции — он сначала удаляет все строки из связывающей таблицы, а потом выполняет insert;
  • Hibernate не может выполнить одновременный fetch нескольких bag-ов для одной сущности.

What’s new

Latest release announcement (2018-09-10):

5.9.3.Final.

A detailed list of new features, improvements and fixes in this series can be found

on our JIRA instance.

JSR 352 (Batch for Java) mass indexing job

A JSR 352 mass indexing job was added, adding in particular the ability to restart
from a checkpoint when indexing fails.

See
for more information,
and this blog post
for an introduction to JSR 352 in Hibernate Search.

JBoss modules now distributed as feature packs

The Hibernate Search JBoss Modules, for use in WildFly or JBoss EAP,
are now distributed as WildFly feature packs, which makes provisioning
a WildFly server with an upgraded Hibernate Search version easier than ever.
The feature packs can also be consumed using WildFly Swarm.

Also, the modules are now distributed as multiple feature packs,
which means that components are split in fine grained packages,
allowing you to pick only the parts you will need.
For example, you won’t need to add the Elasticsearch clients to your server if you only use Lucene.

See
for more information on the available feature packs and how to consume them.

Mapping

Mapping (сопоставление, проецирование) Java-классов с таблицами базы данных осуществляется с помощью конфигурационных XML-файлов или Java-аннотаций. При использовании файла XML Hibernate может генерировать скелет исходного кода для классов длительного хранения. В этом нет необходимости, если используется аннотация. Hibernate может использовать файл XML или аннотации для поддержки схемы базы данных.

Обеспечиваются возможности по организации отношения между классами «один-ко-многим» и «многие-ко-многим». В дополнение к управлению связями между объектами Hibernate также может управлять рефлексивными отношениями, где объект имеет связь «один-ко-многим» с другими экземплярами своего собственного типа данных.

Hibernate поддерживает отображение пользовательских типов значений. Это делает возможными такие сценарии:

  • Переопределение типа по умолчанию SQL, Hibernate выбирает при отображении столбца свойства.
  • Проецирование перечисляемого типа Java на поле БД, будто они являются обычными свойствами.
  • Проецирование одного свойства в несколько колонок.

Литература[править | править код]

  • К. Бауэр, Г. Грегори, Г. Кинг. Java Persistence API и Hibernate = Java Persistence with Hibernate. — 2-е. — ДМК Пресс, 2017. — 632 с. — ISBN 978-5-97060-180-8.
Одна из первых книг по Hibernate, написанная опытным разработчиком из Singlewire Software, работавшим с объектно-ориентированными технологиями задолго до того, как это стало популярным.

Bauer, Christian, King, Gavin. Hibernate In Action. — 1st ed. — Greenwich: Manning Publications, 2004, August 1. — 408 p. — (In Action). — ISBN 1-932394-15-X, ISBN 978-1-932394-15-3.

Christian Bauer — участник команды разработки Hibernate, Gavin King — основатель проекта Hibernate, участник экспертной группы EJB 3.0 (JSR 220), руководитель в разработке стандарта Web Beans JSR 299, включающего концепции Hibernate, JSF и EJB 3.0. Книга описывает устаревшую версию Hibernate 2.x. Считается одной из лучших по отзывам критиков

Bauer, Christian, King, Gavin. Java Persistence with Hibernate / Foreword by Linda DeMichiel. — 1st ed. — Greenwich: Manning Publications, 2006, November 24. — 904 p. — ISBN 1-932394-88-5, ISBN 978-1-932394-88-7.

Фактически это обновлённая и пересмотренная версия книги «Hibernate in Action», здесь описывается Hibernate 3.x и JPA. Второе издание этой книги, описывающее Hibernate 5, запланировано к выходу в начале 2015 г. (отдельные главы выложены в электронном виде с марта 2013)

Linwood, Jeff, Minter, Dave. Beginning Hibernate: From Novice to Professional. — 3rd ed. — Apress, 2006, August 25. — 360 p. — ISBN 1-59059-693-5. Архивная копия от 24 декабря 2010 на Wayback Machine

Linwood, Jeff, Minter, Dave. Beginning Hibernate. — 2nd ed. — Apress, 2010, May 28. — 400 p. — ISBN 1-4302-2850-4. Архивная копия от 5 декабря 2010 на Wayback Machine

Elliott, James, O’Brien, Timothy M., Fowler, Ryan. Harnessing Hibernate. — 1st ed. — O’Reilly Media, 2008, April 22. — 382 p. — ISBN 978-0-596-51772-4, ISBN 0-596-51772-6, ISBN 978-0-596-15948-1 (e-book), ISBN 0-596-15948-X (e-book).

Bernard, Emmanuel, Griffin, John. Hibernate Search in Action. — 1st ed. — Manning Publications, 2008, December 30. — 488 p. — (In Action). — ISBN 1-933988-64-9.

Releases in this series

5.2.0.Final

2018-02-05

Infinispan 9.1, Cache creation for Infinispan Remote, Use of clustered counters in Infinispan Embedded, MongoDB geospatial support

Download

Resolved issues

Release announcement

5.2.0.CR1

2018-01-29

MongoDB geospatial support, integration with Infinispan cluster counters

Download

Resolved issues

Release announcement

5.2.0.Beta1

2017-10-17

Update to Infinispan 9.1, Cache creation with Infinispan Remote

Download

Resolved issues

Release announcement

5.2.0.Alpha1

2017-09-11

Grouping for Infinispan remote, move dialects in separate repositories, support map-reduce in MongoDB native queries

Download

Resolved issues

Release announcement

Создание объектов POJO и файлов сопоставления по отдельности

Поскольку POJO представляет собой простой класс Java, вы можете использовать мастер создания классов Java, чтобы создать класс, а затем изменить класс в редакторе исходного кода, чтобы добавить необходимые поля и методы получения и установки. После создания объекта POJO мастер также можно использовать для создания файла сопоставления библиотеки Hibernate, обеспечивающего сопоставления класса с таблицей, и добавления информации о сопоставлении в файл hibernate.cfg.xml. При создании файла сопоставления «с нуля» необходимо сопоставить поля и столбцы в редакторе XML.

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

  1. Щелкните правой кнопкой мыши узел «Source Packages» в окне «Projects» и выберите «New > Java Class» для открытия мастера создания класса Java.
  2. В мастере введите Actor в качестве имени класса и sakila.entity в качестве имени пакета. Нажмите кнопку «Завершить».
  3. Внесите в класс следующие изменения (выделены полужирным шрифтом) для реализации интерфейса «Serializable» и добавьте поля для столбцов таблицы.
    public class Actor implements Serializable {
        private Short actorId;
        private String firstName;
        private String lastName;
        private Date lastUpdate;
    }
  4. Щелкните правой кнопкой мыши в редакторе и выберите ‘Вставить код’ (Alt-Insert, Ctrl-I на Mac) и выберите методы получения и установки в контекстном меню для создания методов получения и установки для полей.
  5. В диалоговом окне «Generate Getters and Setters» выберите все поля и нажмите кнопку «Generate».

    В диалоговом окне «Generate Getters and Setters» можно использовать стрелку вверх на клавиатуре для перемещения выбранного элемента к узлу «Actor», а затем нажать клавишу «пробел» и выбрать все поля «Actor».

  6. Исправьте операторы импорта и сохраните измененные данные.

После создания объекта POJO для таблицы необходимо создать файл сопоставления библиотеки Hibernate для класса Actor.java.

  1. Щелкните правой кнопкой мыши узел исходных файлов sakila.entity в окне «Projects» и выберите «New > Other» для открытия мастера создания файла «New File».
  2. Выберите «Hibernate Mapping File» в категории «Hibernate». Нажмите кнопку «Далее».
  3. Введите Actor.hbm в поле «File Name» и убедитесь в том, что выбрана папка src/sakila/entity. Нажмите кнопку «Далее».
  4. Введите sakila.entity.Actor в поле «Class to Map» и выберите actor из раскрывающегося списка «Database Table». Нажмите кнопку «Завершить».

    После выбора ‘Готово’ файл сопоставления Hibernate Actor.hbm.xml открывается в редакторе исходного кода. Также в среде IDE выполняется автоматическое добавление записи для ресурса сопоставления в hibernate.cfg.xml. В целях просмотра подробных данных разверните узел «Mapping» в режиме проектирования hibernate.cfg.xml или в режиме XML. Запись mapping в обзоре XML будет выглядеть следующим образом:

            <mapping resource="sakila/entity/Actor.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
  5. Сопоставьте поля в Actor.java со столбцами в таблице «ACTOR» путем внесения следующих изменений (выделены полужирным шрифтом) в Actor.hbm.xml.

    <hibernate-mapping>
      <class name="sakila.entity.Actor" table="actor">
        <id name="actorId" type="java.lang.Short">
          <column name="actor_id"/>
          <generator class="identity"/>
        </id>
        <property name="firstName" type="string">
          <column length="45" name="first_name" not-null="true"/>
        </property>
        <property name="lastName" type="string">
          <column length="45" name="last_name" not-null="true"/>
        </property>
        <property name="lastUpdate" type="timestamp">
          <column length="19" name="last_update" not-null="true"/>
        </property>
      </class>
    </hibernate-mapping>

    Для заполнения значений при изменении файла сопоставления можно использовать функцию автозавершения кода.

    Примечание. По умолчанию у созданного элемента class имеется закрывающий тег. Поскольку элементы свойства необходимо добавить между открывающим и закрывающим тегами элемента class, следует внести следующие изменения (выделены полужирным шрифтом). После внесения изменений можно использовать функцию автозавершения кода между тегами class.

    <hibernate-mapping>
      <class name="sakila.entity.Actor" table="actor">
      </class>
    </hibernate-mapping>
  6. Нажмите кнопку «Validate XML» на панели инструментов и сохраните изменения.

Создание объектов POJO и файлов сопоставления библиотеки Hibernate может эффективно использоваться для дальнейшей настройки приложения.

Генераторы

  • GenerationType.AUTO — выбор генератора осуществляется на основе диалекта. Не самый лучший вариант, так как тут как раз действует правило “явное лучше неявного”.
  • GenerationType.IDENTITY — самый простой способ конфигурирования генератора. Он опирается на auto-increment колонку в таблице. Следовательно, чтобы получить id при persist-е нам нужно сделать insert. Именно поэтому он исключает возможность отложенного persist-а и следовательно batching-а.
  • GenerationType.SEQUENCE — наиболее удобный случай, когда id мы получаем из sequence.
  • GenerationType.TABLE — в этом случае hibernate эмулирует sequence через дополнительную таблицу. Не самый лучший вариант, т.к. в таком решении hibernate приходится юзать отдельную транзакцию и lock на строчку.
  • none — без оптимизаций. за каждым id дергаем sequence.
  • pooled и pooled-lo — в этом случае наш сиквенс должен увеличиваться на некий интервал — N в БД(SequenceGenerator.allocationSize). А в приложении у нас появляется некий pool, значения из которого который мы можем присваивать новым сущностям не обращаясь к БД..
  • hilo — для генерации ID алгоритм hilo использует 2 числа: hi (хранится в БД — значение, полученное от вызова sequence) и lo(хранится только в приложении — SequenceGenerator.allocationSize). На основе этих чисел интервал для генерации id рассчитывается так: [(hi — 1) * lo + 1, hi * lo + 1). По понятным причинам этот алгоритм считается устарелым и использовать его не рекомендуется.
  • SequenceHiLoGenerator — старый генератор, который использует hilo оптимизатор. Выбирается по-умолчанию, если у нас свойство hibernate.id.new_generator_mappings == false.
  • SequenceStyleGenerator — используется по-умолчанию (если свойство hibernate.id.new_generator_mappings == true). Этот генератор поддерживает несколько оптимизаторов, но по-умолчанию используется pooled.
Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий