SpringData JPA框架使用时出现JSON循环依赖解决方案
困扰许久的问题终于解决了,之前项目太赶,没有深入学习解决,不甘心,今天再次搭起架子试试,哈哈,终于解决!
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
@JoinColumn(name="approvalForCarId",nullable = false)
private ApprovalForCar approvalForCar;
@JsonIgnoreProperties(ignoreUnknown = true, value = {"approvalForCar"})
@OneToMany(mappedBy = "approvalForCar",cascade = { CascadeType.MERGE,CascadeType.REMOVE},fetch = FetchType.EAGER)
private List<DistributeCar> distributeCars = new ArrayList<>(0);
双向关联时json序列化时会出现死循环的情况
jackson解决问题的方式是循环的那一部分不解析
JsonIgnoreProperties配置不解析的属性
g:第一个“栗子",只有两个类关联,但互相引用了,多对多和一对一这里都适用
Book类上面放入
@JsonIgnoreProperties(ignoreUnknown = true, value =
{"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Book{
... ...
Book类中属性上注解,此属性Author中引用了private Set books;
public class Book{
... ...
@JsonIgnoreProperties(ignoreUnknown = true, value = {"books"})
private Set<Author> authors;
... ...
Author类上面放入
@JsonIgnoreProperties(ignoreUnknown = true, value =
{"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Author{
... ...
Author类中属性上注解,此属性Book中引用了private Set authors;
public class Author{
... ...
@JsonIgnoreProperties(ignoreUnknown = true, value = {"authors"})
private Set<Book> books;
... ...
上面的例子“栗子"过去久远,只对关键需要配置的地方进行了标注
eg:第二个“栗子",有三个类关联,通过一个中间类关联直接贴代码
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Entity
@JsonIgnoreProperties(ignoreUnknown = true, value =
{"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@TableGenerator(name = "book_generator", table = "tables_sequence", allocationSize = 1, initialValue = 0)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "book_generator")
private int id;
private String name;
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnoreProperties(ignoreUnknown = true, value = {"book"})
private Set<BookPublisher> bookPublishers;
public Book() {
}
public Book(String name) {
this.name = name;
bookPublishers = new HashSet<>();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<BookPublisher> getBookPublishers() {
return bookPublishers;
}
public void setBookPublishers(Set<BookPublisher> bookPublishers) {
this.bookPublishers = bookPublishers;
}
}
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;
@Entity
@JsonIgnoreProperties(ignoreUnknown = true, value =
{"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Publisher implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@TableGenerator(name = "pub_generator", table = "tables_sequence", allocationSize = 1, initialValue = 0)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "pub_generator")
private int id;
private String name;
@OneToMany(mappedBy = "publisher")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"publisher"})
private Set<BookPublisher> bookPublishers;
public Publisher() {
}
public Publisher(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<BookPublisher> getBookPublishers() {
return bookPublishers;
}
public void setBookPublishers(Set<BookPublisher> bookPublishers) {
this.bookPublishers = bookPublishers;
}
}
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Table(name = "book_publisher")
@JsonIgnoreProperties(ignoreUnknown = true, value =
{"hibernateLazyInitializer", "handler", "fieldHandler"})
public class BookPublisher implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "book_id")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"bookPublishers"})
private Book book;
@Id
@ManyToOne
@JoinColumn(name = "publisher_id")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"bookPublishers"})
private Publisher publisher;
@Column(name = "published_date")
private Date publishedDate;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public Publisher getPublisher() {
return publisher;
}
public void setPublisher(Publisher publisher) {
this.publisher = publisher;
}
public Date getPublishedDate() {
return publishedDate;
}
public void setPublishedDate(Date publishedDate) {
this.publishedDate = publishedDate;
}
}
总结:
本实体中引入了另外一个实体,但另外一个实体也引用了自己无论是集合还是单个实体。jakson在格式化数据的时候会动态过滤掉此属性中对本身对象的引用。
SpringData JPA框架使用时出现JSON循环依赖解决方案的更多相关文章
- ImageView图片不显示---------记glide框架使用时遇到的问题
最近在开发项目的时候,使用了谷歌推荐的glide框架,却发现了一个莫名奇妙的问题,就是imageview始终不显示图片! 发现图片不显示 但是改为安卓本身自带的ic_launch可以显示ic_laun ...
- Electron使用时拦截HTTP请求的解决方案
背景 最近在做一个Web和Electron共用一份代码的工程,由于使用到了第三方的库(我们是在线地图),该库的认证方式是请求时加key,并且它在后台会校验referer. 于是问题就来了,Electr ...
- 浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- 【持久层框架】- SpringData - JPA
SpringData - JPA 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! JPA简 ...
- SpringData JPA详解
Spring Data JPA 1. 概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...
- Saiku嵌入系统使用时传参数访问saiku(十六)
Saiku嵌入系统使用时传参数访问saiku Saiku通过iframe嵌入其他系统使用时,我们可以设定参数信息,然后根据url中参数对结果进行筛选哦. 这里我们实现的是根据日期字段进行范围查询,UR ...
- SpringBoot整合SpringData JPA入门到入坟
首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...
- SpringData JPA 接口和方法
1.1 简单查询--接口方法 1.2 五个接口详解 1.2.1 CrudRepository接口 其中T是要操作的实体类,ID是实体类主键的类型.该接口提供了11个常用操作方法. @NoRepo ...
- springData Jpa 快速入门
前言: 数据持久化的操作,一般都要由我们自己一步步的去编程实现,mybatis通过我们编写xml实现,hibernate也要配置对应的xml然后通过创建session执行crud操作.那么有没有这样一 ...
随机推荐
- npm2 与 npm3的包版本管理
npm2采用严格的包依赖模式 npm install name@1.2.* ---- 1.2.0 <= version <= 1.2.9 npm install name@1.* ---- ...
- 小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题
问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...
- 【Mybatis】【2】处理大于号小于号及其他特殊字符
正文: 问题:用<的时候会报错.因为是xml文件,会被识别成标签 解决方法: 原sql:SELECT * FROM TABLE T WHERE T.AGE < 10; 1,转义字符.用转义 ...
- 中国历史人物传记数据库 CBDB 若干表简介
''' 推荐使用SQLite版本的CBDB数据库 推荐使用SQlite Studio进行数据库的操作 免费,可视化操作,轻量级应用,无需配置,学习扩展性好,非常适合广大历史系学生. ''' 一 人物基 ...
- WCF发布到IIS 7.0,并以https访问
一.IIS 7.0中如何生成服务器证书,并要求网站以http访问可参考: http://www.cnblogs.com/chnking/archive/2008/10/07/1305811.html ...
- Python3+SQLAlchemy不使用字段名获取主键值教程
一.说明 1.1 环境说明 user model如下,且其现有一个实例user_inst: class User(Base): __tablename__ = 'users' username = C ...
- 201621123075 week8-集合
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 indexOf中对 ...
- Cookie中的sessionid与JSONP原理
一.首先说明一下cookie中的sessionid的作用. 1.cookie只是一些文本内容,多是键值对的形式,是请求头中的一部分 2.http是无连接的 知道这两点,就可以很容易的理解session ...
- git 操作规范
分支描述 长期存在 online 主分支,负责记录上线版本的迭代,该分支代码与线上代码是完全一致的. dev 开发分支,该分支记录相对稳定的版本,所有的feature分支都从该分支创建. 多套开发环境 ...
- VirtualBox fedora29 安装
目录 准备工作 VirtualBox安装 fedora安装 快捷键定义 准备工作 平台配置 win10 64位 内存 8G 硬盘 1T 下载地址 VirtualBox 5.2.22:https://w ...