Автор оригинала: 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 Mapproperties = 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
ознакомьтесь с этой статьей .