jpa映射json_如何使用JPA和Hibernate映射JSON集合
jpa映射json
介绍
开源的hibernate-types
项目允许您将Java对象或Jackson JsonNode
为JPA实体属性。
最近,由于我们的杰出贡献者,我们添加了对类型安全集合的支持,该集合也可以作为JSON持久化。 在本文中,您将了解如何实现此目标。
Maven依赖
首先,您需要在项目pom.xml
配置文件中设置以下Maven依赖项:
<dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><version>${hibernate-types.version}</version>
</dependency>
如果您使用的是旧版本的Hibernate,请查看hibernate-types
GitHub存储库 ,以获取有关当前Hibernate版本的匹配依赖项的更多信息。
领域模型
假设我们具有以下Location
Java对象类型。
public class Location implements Serializable {private String country;private String city;//Getters and setters omitted for brevity@Overridepublic String toString() {return "Location{" +"country='" + country + '\'' +", city='" + city + '\'' +'}';}
}
并且,一个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
, @Id
@Version
)和几种海关Hibernate类型,其中,我们对JsonBinaryType
感兴趣。
@TypeDefs({@TypeDef(name = "string-array", typeClass = StringArrayType.class),@TypeDef(name = "int-array", typeClass = IntArrayType.class),@TypeDef(name = "json", typeClass = JsonStringType.class),@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),@TypeDef(name = "jsonb-node", typeClass = JsonNodeBinaryType.class),@TypeDef(name = "json-node", typeClass = JsonNodeStringType.class),
})
@MappedSuperclass
public class BaseEntity {@Idprivate Long id;@Versionprivate Integer version;//Getters and setters omitted for brevity
}
有关使用@MappedSuperclass
更多详细信息,请@MappedSuperclass
本文 。
TypeReferenceFactory
要将Location
对象存储在jsonb
PostgreSQL列中,我们只需要使用@Type(type = "jsonb")
注释location
属性。
但是,对于alternativeLocations
集合,我们需要提供关联的Jackson TypeReference
以便在从关系数据库中读取JSON对象时,我们可以重建非常相同的类型安全的Java集合。
为此,我们提供TypeReferenceFactory
实现的完全限定的类,如下所示:
public static class AlternativeLocationsTypeReference implements TypeReferenceFactory {@Overridepublic TypeReference<?> newTypeReference() {return new TypeReference<List<Location>>() {};}
}
而已!
测试时间
保存以下Event
实体时:
Location cluj = new Location();
cluj.setCountry("Romania");
cluj.setCity("Cluj-Napoca");Location newYork = new Location();
newYork.setCountry("US");
newYork.setCity("New-York");Location london = new Location();
london.setCountry("UK");
london.setCity("London");Event event = new Event();
event.setId(1L);
event.setLocation(cluj);
event.setAlternativeLocations(Arrays.asList(newYork, london)
);entityManager.persist(event);
Hibernate将生成以下SQL INSERT语句:
INSERT INTO event (version, alternativeLocations, location, id
)
VALUES (0, [{"country":"US","city":"New-York"},{"country":"UK","city":"London"}], {"country":"Romania","city":"Cluj-Napoca"}, 1
)
此外,检索回时Event
实体,无论是location
,并the
alternativeLocations`属性是正确的获取:
事件event = entityManager.find(Event.class,eventId);
assertEquals("Cluj-Napoca", event.getLocation().getCity()
);assertEquals(2, event.getAlternativeLocations().size());assertEquals("New-York", event.getAlternativeLocations().get(0).getCity()
);
assertEquals("London", event.getAlternativeLocations().get(1).getCity()
);
酷吧?
翻译自: https://www.javacodegeeks.com/2017/12/map-json-collections-using-jpa-hibernate.html
jpa映射json
jpa映射json_如何使用JPA和Hibernate映射JSON集合相关推荐
- 如何使用JPA和Hibernate映射JSON集合
介绍 开源的hibernate-types项目允许您将Java对象或Jackson JsonNode为JPA实体属性. 最近,感谢我们的杰出贡献者,我们添加了对类型安全集合的支持,该集合也可以作为JS ...
- JPA教程:JPA概述、JPA实体生命周期、JPA实体映射关系、JPA查询语言
JPA定义了Java ORM及实体操作API的标准.本文摘录了JPA的一些关键信息以备查阅. 如果有hibernate的基础,通过本文也可以快速掌握JPA的基本概念及使用. 1 JPA概述 JPA(J ...
- JPA休眠替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?
你好!你好吗? 今天,我们将讨论不建议使用JPA / Hibernate的情况. 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /休眠问题 解决一些JPA /休眠问题的方法 选择此处 ...
- jpa的查询api_为JPA的本机查询API键入安全查询
jpa的查询api 当您使用JPA时-有时-JPQL不能解决问题,您将不得不使用本机SQL. 从一开始,像Hibernate这样的ORM就为这些情况保留了开放的"后门",并为Spr ...
- jpa 查询 列表_终极JPA查询和技巧列表–第2部分
jpa 查询 列表 这一部分是该系列文章的第一部分 . JPA:NamedQuery,使用日期查询,有关getSingleResult方法的警告 为了避免重复查询代码,提高性能并简化维护查询,我们可以 ...
- ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...
- 什么是JPA?SpringBoot 中使用JPA
一.JPA介绍 JPA (Java Persistence API)Java持久化API,是一套Sun公司Java官方制定的ORM 规范(sun公司并没有实现). ORM(Object Relatio ...
- 【Spring Data JPA自学笔记一】JPA是什么?JPA访问数据库初体验
文章目录 JPA是什么? JDBC的诞生 JPA的诞生 如何使用JPA? 配置JPA 配置pom.xml 配置persistence.xml 实现POJO类 调用JPA方法 关于EntityManag ...
- jpa 查询 列表_终极JPA查询和技巧列表–第3部分
jpa 查询 列表 在阅读第三部分之前,请记住本系列的第一部分和第二部分 JPA:通过查询创建对象 JPA允许我们使用所需的值在查询内创建对象: package com.model;public cl ...
最新文章
- 用NumPy genfromtxt导入数据
- netstat 命令state值
- Android 7.0 SystemUI 之启动和状态栏和导航栏简介
- yolov3安卓实现_从零实现YOLOv3
- servlet学习笔记二
- JWT认证原理、整合springboot实战应用
- vc编译器编译linux平台拷贝的源码问题
- ie手机浏览器_哪款浏览器可以说成为装机必备?
- phpstorm 10 注册码
- 清空数据库中的某个表中数据
- SQL AZURE数据库创建,云计算体验之一
- 构建自己的不可替代性
- css格式规范stylelint在vscode使用教程(ctrl+s自动智能修复)
- Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)
- Android多点触控最佳实践
- Python len() 函数
- [USACO06NOV]玉米田Corn Fields
- java版,实现人民币的大小写转换
- layui 表格在点表头排序时数据错乱
- CodeForces 1397E :Monster Invaders DP
热门文章
- [NOIP 2009 提高组]最优贸易
- P3971-[TJOI2014]Alice and Bob【贪心】
- P3385-[模板]负环【SPFA】
- P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
- codeforces1486 F. Pairs of Paths(倍增+树上数数)
- 【bfs】神殿(jzoj 2296)
- Wannafly挑战赛19
- Flowable学习笔记(一、入门)
- Windows7下如何设置MyEclipse2014字体大小
- Java:对double值进行四舍五入,保留两位小数的几种方法