Рубрики
Без рубрики

Руководство по библиотеке типов гибернации

Узнайте, как использовать типы гибернации и расширить набор типов гибернации.

Автор оригинала: Andre Browne.

1. Обзор

В этом уроке мы рассмотрим типы гибернации. Эта библиотека предоставляет нам несколько типов, которые не являются родными для основной операционной системы Hibernate ORM.

2. Зависимости

Чтобы включить типы гибернации, мы просто добавим соответствующие типы гибернации зависимости :


    com.vladmihalcea
    hibernate-types-52
    2.9.7

Это будет работать с версиями гибернации 5.4, 5.3, и 5.2.

В случае, если версия Hibernate старше, значение artifactId выше будет другим. Для версий 5.1 и 5.0, мы можем использовать hibernate-типы-51. Аналогично, версия 4.3 требуется спящий режим-типы-43, и версии 4.2, и 4.1 требуется спящий режим-типы-4.

Для примеров в этом руководстве требуется база данных. Используя Docker, мы предоставили контейнер базы данных. Поэтому нам понадобится рабочая копия Docker .

Итак, для запуска и создания нашей базы данных нам нужно всего лишь выполнить:

$ ./create-database.sh

3. Поддерживаемые Базы данных

Мы можем использовать наши типы с базами данных Oracle, SQL Server, PostgreSQL и MySQL. Поэтому сопоставление типов в Java с типами столбцов базы данных будет варьироваться в зависимости от используемой нами базы данных. В нашем случае мы будем использовать MySQL и сопоставим двоичный тип Json с типом столбца JSON.

Документацию по поддерживаемым сопоставлениям можно найти в репозитории типов гибернации .

4. Модель Данных

Модель данных для этого урока позволит нам хранить информацию об альбомах и песнях. Альбом имеет обложку и одну или несколько песен. Песня имеет исполнителя и длину. На обложке есть два URL-адреса изображений и код UPC. Наконец, у артиста есть имя, страна и музыкальный жанр.

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

В этом уроке мы создадим таблицы только для альбомов и песен:

public class Album extends BaseEntity {
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private CoverArt coverArt;

    @OneToMany(fetch = FetchType.EAGER)
    private List songs;

   // other class members
}
public class Song extends BaseEntity {

    private Long length = 0L;

    @Type(type = "json")
    @Column(columnDefinition = "json")
    private Artist artist;

    // other class members
}

Используя Тип Строки Json мы представим обложку и художников в виде столбцов JSON в этих таблицах:

public class Artist implements Serializable {
 
    private String name;
    private String country;
    private String genre;

    // other class members
}
public class CoverArt implements Serializable {

    private String frontCoverArtUrl;
    private String backCoverArtUrl;
    private String upcCode;

    // other class members
}

Важно отметить, что классы Художник и Обложка являются POJO, а не сущностями. Кроме того, они являются членами наших классов сущностей базы данных, определенных с помощью аннотации @Type(тип) .

4.1. Хранение типов JSON

Мы определили наши модели альбомов и песен так, чтобы они содержали участников, которых база данных будет хранить в формате JSON. Это связано с использованием предоставленного типа json . Чтобы этот тип был доступен для использования, мы должны определить его с помощью определения типа:

@TypeDefs({
  @TypeDef(name = "json", typeClass = JsonStringType.class),
  @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
public class BaseEntity {
  // class members
}

Тип @ для строкового типа Json и Двоичного типа Json делает доступными типы json и jsonb|/.

Последние версии MySQL поддерживают JSON в качестве типа столбца. Следовательно, JDBC обрабатывает любой прочитанный JSON или любой объект, сохраненный в столбце с любым из этих типов в виде Строки . Это означает, что для правильного сопоставления со столбцом мы должны использовать Строковый тип Json в вашем определении типа.

4.2. Переход в спящий режим

В конечном счете, наши типы будут автоматически переведены на SQL с помощью JDBC и гибернации. Итак, теперь мы можем создать несколько объектов песни, объект альбома и сохранить их в базе данных. Впоследствии Hibernate создает следующие инструкции SQL:

insert into song (name, artist, length, id) values ('A Happy Song', '{"name":"Superstar","country":"England","genre":"Pop"}', 240, 3);
insert into song (name, artist, length, id) values ('A Sad Song', '{"name":"Superstar","country":"England","genre":"Pop"}', 120, 4);
insert into song (name, artist, length, id) values ('A New Song', '{"name":"Newcomer","country":"Jamaica","genre":"Reggae"}', 300, 6)
insert into album (name, cover_art, id) values ('Album 0', '{"frontCoverArtUrl":"http://fakeurl-0","backCoverArtUrl":"http://fakeurl-1","upcCode":"b2b9b193-ee04-4cdc-be8f-3a276769ab5b"}', 7)

Как и ожидалось, все наши объекты Java типа json переводятся Hibernate и хранятся в хорошо сформированном JSON в нашей базе данных.

5. Хранение Универсальных Типов

Помимо поддержки столбцов на основе JSON, библиотека также добавляет несколько универсальных типов: Год , Год, и Месяц из пакета java.time .

Теперь мы можем сопоставить эти типы, которые изначально не поддерживаются Hibernate или JPA . Кроме того, теперь у нас есть возможность хранить их в виде Целого числа , Строки, или Даты столбца.

Например, предположим, что мы хотим добавить записанные данные песни в нашу песню модель и сохранить их в виде Целого числа в нашей базе данных. Мы можем использовать целочисленный тип Год месяц в нашем определении класса сущностей Песня :

@TypeDef(
  typeClass = YearMonthIntegerType.class,
  defaultForType = YearMonth.class
)
public class Song extends BaseEntity {
    @Column(
      name = "recorded_on",
      columnDefinition = "mediumint"
    )
    private YearMonth recordedOn = YearMonth.now();

    // other class members  
}

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

6. Другие Классы Полезности

В типах гибернации есть несколько вспомогательных классов, которые еще больше улучшают работу разработчиков при использовании Hibernate.

Стратегия именования camelCase Для случая змеи сопоставляет свойства, связанные с верблюдами, в наших классах Java со столбцами в змеином корпусе в нашей базе данных.

Интегратор импорта классов | позволяет использовать простые значения имен классов Java DTO в параметрах конструктора JPA.

Существуют также классы ListResultTransformer и MapResultTransformer , обеспечивающие более чистые реализации объектов результатов, используемых JPA. Кроме того, они поддерживают использование лямбда-выражений и обеспечивают обратную совместимость со старыми версиями JPA.

7. Заключение

В этом уроке мы представили библиотеку Java типов Hibernate и новые типы, которые она добавляет в Hibernate и JPA. Мы также рассмотрели некоторые утилиты и универсальные типы, предоставляемые библиотекой.

Реализация примеров и фрагментов кода доступна на GitHub .