码上敲享录 > 最全面的HTML入门教程 > hibernate的实体类双向关联转json报错之死循环解决方案

hibernate的实体类双向关联转json报错之死循环解决方案

上一章章节目录下一章 2017-08-25已有2477人阅读 评论(0)

有时候我们希望实体类转成json的时候,把一方和多方都转成json,即双向关联。这种将Object转化为JSON数据的方法比较常见,但是它这个架包识别不到@JsonIgnoreProperties和@JsonIgnore这个注解,因为他们不是同一个架包,不是同一个规范,所以在转化JSON的时候,还是会发生循环引用的问题。


简单实用的例子如下:

一方的实体,中有多方的关联

public class CgFormHeadEntity implements java.io.Serializable {

private List<CgFormFieldEntity> columns;

 @OneToMany(cascade=CascadeType.REMOVE,mappedBy="table") @OrderBy(clause="orderNum asc")

public List<CgFormFieldEntity> getColumns() {

return columns;

}


public void setColumns(List<CgFormFieldEntity> columns) {

this.columns = columns;

}


}


多方的实体,一方的关联

public class CgFormFieldEntity implements java.io.Serializable {

private CgFormHeadEntity table;

    @ManyToOne

@JoinColumn(name ="table_id",nullable=false,referencedColumnName="id")

@JsonIgnore//还是会发生循环引用的问题

@ForeignKey(name="null")

public CgFormHeadEntity getTable(){

return this.table;

}

public void setTable(CgFormHeadEntity table){

this.table = table;

}

}


进行一方的实体的json配置,return true代表过滤这个属性,不进行转json,下面的配置指明过滤实体中名字为table,且数据类型为CgFormHeadEntity的属性。这个配置应用在CgFormHeadEntity 的对象转json的时候,会把CgFormHeadEntity 实体中的属性,包括columns属性转json,之所以过滤table的原因是,转columns属性为json的时候,把columns集合里的一方的引用过滤掉,从而防止死循环。

JsonConfig jsonConfig = new JsonConfig();  

jsonConfig.setJsonPropertyFilter(new PropertyFilter() {  

   public boolean apply(Object obj, String name, Object value) {  

   if(value instanceof CgFormHeadEntity&&name.equals("table")){

       return true;  

   }else{  

       return false;  

   }  

  }  

});



用法:

CgFormHeadEntity table = (CgFormHeadEntity) sysProcessService.findUniqueByProperty

(CgFormHeadEntity.class, "tableName",sysParams.getParamsType());

JSONArray json= JSONArray.fromObject(table.getColumns(), jsonConfig);

String str= json.toString();//一定要转字符串,要不然,前端获取数据时,还回死循环






向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交