这是一个很常见的需求,所以我就这个话题写了a very detailed article。
休眠类型项目
您需要做的第一件事是将hibernate-types 开源项目添加到您的 Maven 或 Gradle 配置文件中。
实体映射
之后,使用JsonBinaryType,如下所示:
@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
name = "jsonb",
typeClass = JsonBinaryType.class
)
public static class Book {
@Id
@GeneratedValue
private Long id;
@NaturalId
private String isbn;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private String properties;
//Getters and setters omitted for brevity
}
持久化实体
现在,当您持久化以下 Book 实体时:
entityManager.persist(
new Book()
.setIsbn("978-9730228236")
.setProperties(
"{" +
" \"title\": \"High-Performance Java Persistence\"," +
" \"author\": \"Vlad Mihalcea\"," +
" \"publisher\": \"Amazon\"," +
" \"price\": 44.99" +
"}"
)
);
Hibernate 将正确保存 JSON 属性:
INSERT INTO book (
isbn,
properties,
id
)
VALUES (
'978-9730228236',
'{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99}',
1
)
获取实体
获取实体按预期工作:
Book book = entityManager
.unwrap(Session.class)
.bySimpleNaturalId(Book.class)
.load("978-9730228236");
assertTrue(book.getProperties().contains("\"price\": 44.99"));
因此,您不必创建任何自定义 Hibernate 类型,因为您可以在 hibernate-types 项目中找到正确的类型。