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