困扰许久的问题终于解决了,之前项目太赶,没有深入学习解决,不甘心,今天再次搭起架子试试,哈哈,终于解决!

   
  @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循环依赖解决方案的更多相关文章

  1. ImageView图片不显示---------记glide框架使用时遇到的问题

    最近在开发项目的时候,使用了谷歌推荐的glide框架,却发现了一个莫名奇妙的问题,就是imageview始终不显示图片! 发现图片不显示 但是改为安卓本身自带的ic_launch可以显示ic_laun ...

  2. Electron使用时拦截HTTP请求的解决方案

    背景 最近在做一个Web和Electron共用一份代码的工程,由于使用到了第三方的库(我们是在线地图),该库的认证方式是请求时加key,并且它在后台会校验referer. 于是问题就来了,Electr ...

  3. 浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  4. 【持久层框架】- SpringData - JPA

    SpringData - JPA 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! JPA简 ...

  5. SpringData JPA详解

    Spring Data JPA 1.    概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...

  6. Saiku嵌入系统使用时传参数访问saiku(十六)

    Saiku嵌入系统使用时传参数访问saiku Saiku通过iframe嵌入其他系统使用时,我们可以设定参数信息,然后根据url中参数对结果进行筛选哦. 这里我们实现的是根据日期字段进行范围查询,UR ...

  7. SpringBoot整合SpringData JPA入门到入坟

    首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...

  8. SpringData JPA 接口和方法

    1.1 简单查询--接口方法 1.2 五个接口详解 1.2.1    CrudRepository接口 其中T是要操作的实体类,ID是实体类主键的类型.该接口提供了11个常用操作方法. @NoRepo ...

  9. springData Jpa 快速入门

    前言: 数据持久化的操作,一般都要由我们自己一步步的去编程实现,mybatis通过我们编写xml实现,hibernate也要配置对应的xml然后通过创建session执行crud操作.那么有没有这样一 ...

随机推荐

  1. C#中Equals和= =(等于号)的比较)

    C#中Equals和= =(等于号)的比较) 相信很多人都搞不清Equals和 = =的区别,只是零星的懂一点,现在就让我带大家来进行一些剖析 一.           值类型的比较 对于值类型来说  ...

  2. QGis+QT5.9+VS2017源码编译

    1.需要软件 VS2017 QT5.9.2 CMake 3.10.2 Cygwin osgeo4w QGIS源码 2.安装VS2017  过程省略 是由于机器上已经安装了VS2017 3.安装QT5. ...

  3. linux grep find查找文件夹、代码中的某行/字符串

    本文转载于:https://blog.csdn.net/Mr_Cat123/article/details/80541658 在Linux中,由于文件很多,代码很长,可能我们只知道其中的一两个字符串, ...

  4. GIS中的引擎:地图引擎

    什么是地图引擎?它和地图软件有什么区别? 引擎一词是英文单词engine的音译,通常指发动机,就是动力输出设备.诸如汽车.轮船.飞机的动力提供的核心设备就是引擎.IT领域中,常听说的有搜索引擎.图形引 ...

  5. 用Eclipse在Weka中嵌入新算法

    本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...

  6. js 浏览器 宽高 各种

    常用: JS 获取浏览器窗口大小   // 获取窗口宽度   if (window.innerWidth)   winWidth = window.innerWidth;   else if ((do ...

  7. 关于WebUpload插件的使用

    上传的路径地址: 删除图片时也应该注意: unlink('/Upload/1.jpg')删除不了 unlink('./Upload/1.jpg')可以删除. 也就是说,绝对路径删除不了  相对路径可以 ...

  8. [Codeforces477D]Dreamoon and Binary

    Problem 给定一个字符串数的二进制表示(不含前导0)s(长度不超过5000), 对于一个数n(初值为0),可以进行以下两种操作: 1.将n的二进制表示(无前导0)写到已经写的串的后面. 2.n加 ...

  9. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  10. Spring源码学习(3)—— 自定义标签

    上一篇讲了Spring对默认标签的解析,Spring提供了很多属性,可以供开发者根据不同情况使用.绝大多数情况下,这些功能就已经足够了.但是,当用户有更特殊的需求,又或者很多公司自己实现的服务治理框架 ...