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

Как сопоставить свойство сущности PostgreSQL HStore с JPA и гибернацией

Узнайте, как сопоставить тип столбца PostgreSQL HStore со свойством сущности JPA с помощью Hibernate и проекта с открытым исходным кодом типа hibernate.

Автор оригинала: Vlad Mihalcea.

Проект с открытым исходным кодом типы гибернации позволяет сопоставлять большое разнообразие типов баз данных, которые изначально не поддерживаются Hibernate ORM (например, JSON, МАССИВ, Год , Месяц , адреса INET).

В этой статье мы рассмотрим, как вы можете сопоставить тип PostgreSQL HStore , который позволяет хранить пары ключ/значение, со свойством сущности Java Map при использовании JPA и гибернации.

Как сопоставить свойство сущности PostgreSQL HStore с JPA и #Hibernate . @vlad_mihalcea https://t.co/360MtHSYmw pic.twitter.com/KcXP3PD6lO

Прежде всего, вам необходимо настроить следующую зависимость Maven в вашем проекте pom.xml файл конфигурации:


    com.vladmihalcea
    hibernate-types-55
    ${hibernate-types.version}

Если вы используете более старые версии Hibernate (например, 5.1 или 4.3), ознакомьтесь с репозиторием hibernate-types GitHub для получения дополнительной информации о соответствующей зависимости для вашей текущей версии Hibernate.

Прежде всего, нам нужно убедиться, что в нашей базе данных установлено расширение store :

CREATE EXTENSION IF NOT EXISTS hstore;

Нашему приложению необходимо хранить Книги сущности в следующей таблице базы данных:

Обратите внимание, что тип столбца свойства – это хранилище , которое

Чтобы сопоставить типы столбцов PostgreSQL hstore с Java Map , вам нужен пользовательский тип гибернации, поскольку встроенные типы не поддерживают постоянные типы, относящиеся к конкретной базе данных. К счастью, благодаря библиотеке hibernate-types вы можете легко сопоставить книгу таблицу со следующей Книгой сущностью:

@Entity(name = "Book")
@Table(name = "book")
@TypeDef(name = "hstore", typeClass = PostgreSQLHStoreType.class)
public class Book {

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    @Column(length = 15)
    private String isbn;

    @Type(type = "hstore")
    @Column(columnDefinition = "hstore")
    private Map properties = new HashMap<>();

    //Getters and setters omitted for brevity
}

Аннотация @TypeDef используется для регистрации PostgreSQL типа HStore пользовательского типа гибернации с именем hstore . После этого атрибут свойства сущности использует аннотацию @Type , чтобы указать, что для обработки этого атрибута сущности следует использовать тип hstore Hibernate.

Теперь при хранении следующей Книги сущности:

Book book = new Book();

book.setIsbn("978-9730228236");
book.getProperties().put("title", "High-Performance Java Persistence");
book.getProperties().put("author", "Vlad Mihalcea");
book.getProperties().put("publisher", "Amazon");
book.getProperties().put("price", "$44.95");

entityManager.persist(book);

Hibernate выполняет следующую инструкцию SQL INSERT:

INSERT INTO book (isbn, properties, id)
VALUES (
    '978-9730228236', 
    '"author"=>"Vlad Mihalcea", 
     "price"=>"$44.95", "publisher"=>"Amazon", 
     "title"=>"High-Performance Java Persistence"', 
    1
)

И когда мы извлекаем сущность Book , мы видим, что все свойства извлечены правильно.

Book book = entityManager
.unwrap(Session.class)
.bySimpleNaturalId(Book.class)
.load("978-9730228236");

assertEquals(
    "High-Performance Java Persistence", 
    book.getProperties().get("title")
);
assertEquals(
    "Vlad Mihalcea", 
    book.getProperties().get("author")
);

Потрясающе, правда?

Проект hibernate-types поддерживает больше, чем тип hstore PostgreSQL. Вы можете сопоставлять перечисления, относящиеся к PostgreSQL , обнуляемые Символы , JSON или даже предоставлять свои собственные неизменяемые пользовательские Типы спящего режима .

Для получения более подробной информации о проекте hibernate-types ознакомьтесь с этой статьей .