Mybatis懒加载和@ResponseBody注解冲突的问题

Mybatis懒加载和@ResponseBody注解冲突的问题

当项目中有多表关联的时候可能会用到Mybatis懒加载,如果是SSM项目,前台请求数据的时候,后台返回数据,如果Controller用了@ResponseBody注解会让Mybatis的懒加载失效(打印日志的时候会发现还是会发送查询子表数据的sql语句)。

发生这个问题的原理是用了@ResponseBody注解的方法在返回数据的时候,序列化的过程中会使用jackson调用类的get方法,Mybatis的懒加载在调用get方法的时候触发,这时懒加载就没了意义。

按需求有多种解决方法,在方法或属性上加@JsonIgnore注解,在序列化的时候会忽略该属性使其不参与json转化,但会有一个问题,如果需求上需要这条属性这种做法就…

另一种做法就是@JsonIgnore和@JsonGetter这两个注解配合使用。

比如部门(Dept)和教师(Teacher),在部门类的教师类属性的get方法上加@JsonIgnore,另写一个方法,方法体个get方法一致,方法名无所谓,然后在这个方法上加@JsonGetter。

@JsonIgnore
public List<Teacher> getTeachers() {//默认的get方法
    return teachers;
}

@JsonGetter(value = "teachers")
public List<Teacher> getDetail() {//自定的方法
    return teachers;
}

public void setTeachers(List<Teacher> teachers) {
    this.teachers = teachers;
}

这样会让jackson在序列化的时候不掉用get方法而去调用自定的getDetail方法,也就避免了调用get方法触发了mybatis的懒加载。

还有懒加载的意义是什么。多表关联的时候如果不开启懒加载就会有爆栈(stack over flow)的问题。还是部门和教师,当我去查询部门表的时候会再去查教师表给部门的List teachers 赋值,这时会去查该部门下属教师,查到教师的时候教师还有Dept dept属性,又会去查该教师所属部门,如此往复循环没有结果,最后导致爆栈。懒加载是用到即查,不用就不查,会避免没必要的查询,提高效率。

猜你喜欢

转载自blog.csdn.net/yinkai1995/article/details/80042972