问题点:使用Jackson将Hibenrate的懒加载对象转换json时出现死循环导致内存溢出
最近在做一个项目使用的是Spring+SpringMVC+Hibernate的架构
hibernate是一个非常优秀的ORM框架,它将底层JDBC操作都给封装了,我们直接可以像操作对象一样去操作数据库,虽然现在更多的公司更加倾向于架构的轻量化,由Mybatis比较轻便、学习的起点相对Hibernate来说要低以及查询效率较高,所以mybatis的使用人数逐渐超越Hibernate的趋势或者已经超越了Hibernate的使用人数,但是我依然觉得Hibernate的功能比Mybatis强了几倍不止,但是话又说回来框架没有好坏之分,只是看是不是你项目的使用场景。
言归正传来看咱们的问题:
我有两个类 它们是子父级关系表的实体类 一对多的关系
实体类一: 一的一方
@Table(name="assessment_group ")
@Entity
public class AssessmentGroup implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="id")
private String groupId;//主键
//其他属性....
//一对多关系配置
@OneToMany(fetch=FetchType.EAGER,targetEntity=GroupPersonRelation.class,cascade={CascadeType.ALL},mappedBy="assessmentGroup")
private List<GroupPersonRelation> relationList=new ArrayList<GroupPersonRelation>();
// get、set方法省略
}
实体类二:多的一方
@Table(name="group_person_relation")
@Entity
@JsonIgnoreProperties(value={"assessmentGroup","hibernateLazyInitializer","handler","fieldHandler"})//解决对象转json死循环问题
public class GroupPersonRelation implements Serializable{
private static final long serialVersionUID = 1L;
@Id
private String id;//主键
// 其他属性 省略
@ManyToOne(fetch = FetchType.EAGER,targetEntity = AssessmentGroup.class,cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinColumn(name = "groupId",referencedColumnName="id")
private AssessmentGroup assessmentGroup;
//get、set方法省略
}
配置关系配好了,但是在使用Jackson返回对象时出现了死循环导致内存溢出的问题
因为之前一直在用阿里巴巴的fastjson,不想转json的属性直接加上@JSONField(serialize=false) 就可以搞定,
现在用的是Jackson,也从网上搜了很多种方法比如加 @JsonIgnore注解、配置OpenSessionInView过滤器参数以及其他的一些注解,但是最终没有生效,问题依然出现,终于在查看了源码之后把问题解决了,@JsonIgnoreProperties(value={"assessmentGroup","hibernateLazyInitializer","handler","fieldHandler"})
第一个参数是你不需要转json的对象在本类中的成员变量名,其他的固定写法
很简单吧!!!各位大神们 如有更好的办法 欢迎留言指点。。