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

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


简单实用的例子如下:

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

public class CgFormHeadEntity implements java.io.Serializable {

private List columns;

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

public List getColumns() {

return columns;

}


public void setColumns(List 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;  

   }  

  }  

});


用法地址:http://yayihouse.com/yayishuwu/chapter/985

你可能感兴趣的:(hibernate的实体类双向关联转json报错之死循环解决方案)