介绍
开源 hibernate -types项目可以将Java对象或Jackson映射 JSON Node为 JPA 实体属性。
最近,又增加了对类型安全集合的支持,并将其保留为JSON。
本文将介绍如何使用JPA和Hibernate映射JSON集合。
Maven 依赖
首先,你需要在项目的 pom .xml配置文件中,设置以下Maven依赖:
如果您使用的是旧版本的Hibernate,请在hibernate-types在GitHub上获取有关当前Hibernate版本的相关信息。
领域模型
假设我们有以下Location的java对象类型。
还有一个Event实体:
@Entity(name = "Event")
@Table(name = "event")
public class Event extends BaseEntity {
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private Location location;
@Type(
type = "jsonb",
parameters = {
@org.hibernate.annotations.Parameter(
name = TypeReferenceFactory.FACTORY_CLASS,
value = "com.vladmihalcea.hibernate.type.json.PostgreSQLGenericJsonBinaryTypeTest$AlternativeLocationsTypeReference"
)
}
)
@Column(columnDefinition = "jsonb")
private List<Location> alternativeLocations = new ArrayList<Location>();
//Getters and setters omitted for brevity
}
在BaseEntity定义了一些基本特性(例如@Id,@Version)和几个常见的Hibernate的类型,其中,这里我们关注的是JsonBinaryType类型。
TypeReferenceFactory
要将Location 对象存储 在PostgreSQL类型为jsonb的列中,我们只需要使用注释来注释location属性@Type(type = “jsonb”)。但是,对于alternativeLocations集合,我们需要提供关联的Jackson,TypeReference可以从 关系数据库 中读取JSON对象时,可以重建相同类型安全的Java集合。
为此,我们需要提供完整的TypeReferenceFactory实现类,如下所示:
以上基本已经完成,接下来让我们进行测试
保存Event实体时:
Hibernate将生成以下INSERT的 SQL 语句:
另外,在取回Event实体时,可以正确获取location和alternativeLocations属性:
Event event = entityManager.find(Event.class,eventId);
以上关于这个hibernate-types开源项目映射JSON集合实例应用,很方便吧,如果在你项目框架使用了hibernate,并且相关实体需要映射JSON,试试来学习使用它吧。