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集合相关推荐

  1. 如何使用JPA和Hibernate映射JSON集合

    介绍 开源的hibernate-types项目允许您将Java对象或Jackson JsonNode为JPA实体属性. 最近,感谢我们的杰出贡献者,我们添加了对类型安全集合的支持,该集合也可以作为JS ...

  2. JPA教程:JPA概述、JPA实体生命周期、JPA实体映射关系、JPA查询语言

    JPA定义了Java ORM及实体操作API的标准.本文摘录了JPA的一些关键信息以备查阅. 如果有hibernate的基础,通过本文也可以快速掌握JPA的基本概念及使用. 1 JPA概述 JPA(J ...

  3. JPA休眠替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?

    你好!你好吗? 今天,我们将讨论不建议使用JPA / Hibernate的情况. 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /休眠问题 解决一些JPA /休眠问题的方法 选择此处 ...

  4. jpa的查询api_为JPA的本机查询API键入安全查询

    jpa的查询api 当您使用JPA时-有时-JPQL不能解决问题,您将不得不使用本机SQL. 从一开始,像Hibernate这样的ORM就为这些情况保留了开放的"后门",并为Spr ...

  5. jpa 查询 列表_终极JPA查询和技巧列表–第2部分

    jpa 查询 列表 这一部分是该系列文章的第一部分 . JPA:NamedQuery,使用日期查询,有关getSingleResult方法的警告 为了避免重复查询代码,提高性能并简化维护查询,我们可以 ...

  6. ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查

    上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...

  7. 什么是JPA?SpringBoot 中使用JPA

    一.JPA介绍 JPA (Java Persistence API)Java持久化API,是一套Sun公司Java官方制定的ORM 规范(sun公司并没有实现). ORM(Object Relatio ...

  8. 【Spring Data JPA自学笔记一】JPA是什么?JPA访问数据库初体验

    文章目录 JPA是什么? JDBC的诞生 JPA的诞生 如何使用JPA? 配置JPA 配置pom.xml 配置persistence.xml 实现POJO类 调用JPA方法 关于EntityManag ...

  9. jpa 查询 列表_终极JPA查询和技巧列表–第3部分

    jpa 查询 列表 在阅读第三部分之前,请记住本系列的第一部分和第二部分 JPA:通过查询创建对象 JPA允许我们使用所需的值在查询内创建对象: package com.model;public cl ...

最新文章

  1. 用NumPy genfromtxt导入数据
  2. netstat 命令state值
  3. Android 7.0 SystemUI 之启动和状态栏和导航栏简介
  4. yolov3安卓实现_从零实现YOLOv3
  5. servlet学习笔记二
  6. JWT认证原理、整合springboot实战应用
  7. vc编译器编译linux平台拷贝的源码问题
  8. ie手机浏览器_哪款浏览器可以说成为装机必备?
  9. phpstorm 10 注册码
  10. 清空数据库中的某个表中数据
  11. SQL AZURE数据库创建,云计算体验之一
  12. 构建自己的不可替代性
  13. css格式规范stylelint在vscode使用教程(ctrl+s自动智能修复)
  14. Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)
  15. Android多点触控最佳实践
  16. Python len() 函数
  17. [USACO06NOV]玉米田Corn Fields
  18. java版,实现人民币的大小写转换
  19. layui 表格在点表头排序时数据错乱
  20. CodeForces 1397E :Monster Invaders DP

热门文章

  1. [NOIP 2009 提高组]最优贸易
  2. P3971-[TJOI2014]Alice and Bob【贪心】
  3. P3385-[模板]负环【SPFA】
  4. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
  5. codeforces1486 F. Pairs of Paths(倍增+树上数数)
  6. 【bfs】神殿(jzoj 2296)
  7. Wannafly挑战赛19
  8. Flowable学习笔记(一、入门)
  9. Windows7下如何设置MyEclipse2014字体大小
  10. Java:对double值进行四舍五入,保留两位小数的几种方法