这是一个非常常见的要求,因此我决定写一篇非常详细的文章,介绍使用JPA和Hibernate时映射JSON列类型的最佳方法。
Maven依赖
您需要做的第一件事是在项目配置文件中设置以下Hibernate
Types Maven依赖项
pom.xml:
<dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>${hibernate-types.version}</version></dependency>领域模型
假设您具有以下实体:
@Entity(name = "Book")@Table(name = "book")@TypeDef( typeClass = JsonBinaryType.class, defaultForType = JsonNode.class)public class Book { @Id @GeneratedValue private Long id; @NaturalId private String isbn; @Column(columnDefinition = "jsonb") private JsonNode properties; //Getters and setters omitted for brevity}请注意,
@TypeDef用来指示Hibernate
JsonNode使用
JsonBinaryTypeHibernate
Types项目提供的内容来映射对象。
测试时间
现在,如果您保存实体:
Book book = new Book();book.setIsbn( "978-9730228236" );book.setProperties( JacksonUtil.toJsonNode( "{" + " "title": "High-Performance Java Persistence"," + " "author": "Vlad Mihalcea"," + " "publisher": "Amazon"," + " "price": 44.99" + "}" ));entityManager.persist( book );Hibernate将生成以下SQL语句:
INSERT INTO book ( isbn, properties, id) VALUES( '978-9730228236', '{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99}', 1)您还可以将其加载回并修改它:
Session session = entityManager.unwrap( Session.class );Book book = session .bySimpleNaturalId( Book.class ) .load( "978-9730228236" );LOGGER.info( "Book details: {}", book.getProperties() );book.setProperties( JacksonUtil.toJsonNode( "{" + " "title": "High-Performance Java Persistence"," + " "author": "Vlad Mihalcea"," + " "publisher": "Amazon"," + " "price": 44.99," + " "url": "https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/"" + "}" ));Hibernate
UPDATe为您处理以下声明:
SELECT b.id AS id1_0_FROM book bWHERe b.isbn = '978-9730228236'SELECt b.id AS id1_0_0_ , b.isbn AS isbn2_0_0_ , b.properties AS properti3_0_0_FROM book bWHERe b.id = 1-- Book details: {"price":44.99,"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon"}UPDATE book SET properties = '{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99,"url":"https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/"}'WHERe id = 1


