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

来源:互联网 发布:免费的数据恢复工具 编辑:程序博客网 时间:2024/05/18 05:13

有时候我们希望实体类转成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;  

   }  

  }  

});


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

阅读全文
0 0
原创粉丝点击