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

   
  @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. 修改PL/ORACLE字符编码集

    一.pl/sql developer 中文字段显示乱码 原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二.查看和修改oracle数据库字符集: select ...

  2. vue去掉#——History模式

    打开index.js文件 加在 Vue.use(Router) export default new Router({ mode: 'history', ] }) 若有不明白请加群号:复制 69518 ...

  3. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  4. Win10系列:C#应用控件基础18

    WebView控件 使用WebView控件可以在应用中添加一个简易的网页浏览器窗口,将指定地址的网页内容显示出来,并可以通过WebView控件所提供的方法.属性及事件,实现如页面导航.HTML文本解析 ...

  5. Aop理解 ioc理解

    AOP 把 [核心代码]和[非核心代码]分离 提高开发的效率 java设计模式: https://www.cnblogs.com/malihe/p/6891920.html N+1就是: 1:一条查询 ...

  6. or 的判断

    NeedCompact := NeedCompact or (AdoQ.ExecSQL > 0)

  7. express源码分析

    参考:http://www.cnblogs.com/ginobilee/p/6906204.html https://www.cnblogs.com/zhusheng2008/p/5264096.ht ...

  8. JavaScript 中repalce的使用

    把Paul Pauline pual Paula Paul中的Paul替换成Ringo <!DOCTYPE html> <html> <body> <butt ...

  9. JavaScript之循环

    我是昨天的小尾巴...https://blog.csdn.net/weixin_42217154/article/details/81182817 3.2 循环结构 循环结构是指在程序中需要反复执行某 ...

  10. 20165326 java实验四

    20165326实验四-Android程序设计 一:Android Stuidio的安装测试 1.安装Android Stuidio 具体跟着教程走就行主要是配置的时候要选择下载SDK或手动配置,详细 ...