JPA多对一关联查询时Client无法返回Trainer对象问题排查
问题原因分析
@JsonBackReference的特性限制:你用的
@JsonManagedReference和@JsonBackReference是Jackson解决双向关联递归的一对注解,规则是@JsonManagedReference标记的属性会被正常序列化,而@JsonBackReference标记的属性会被完全忽略。所以查询Client时,它里面被@JsonBackReference标注的Trainer字段不会被序列化,自然返回结果里看不到Trainer对象。移除@JsonBackReference触发无限递归的本质:双向关联的情况下,序列化Client时会先序列化Trainer,而Trainer里又包含Client列表,每个Client又会序列化自己的Trainer,这样循环嵌套调用序列化方法,直到JVM栈内存耗尽,抛出StackOverflowError。
@JsonIdentityInfo适配不了Hibernate代理类:Hibernate为了实现懒加载,会给你的实体类生成动态代理(比如ByteBuddy或者CGLIB代理),这些代理类是原实体的子类。而
@JsonIdentityInfo默认是基于实体的原始类来生成身份标识的,Jackson序列化代理对象时,无法正确识别它和原实体的关联关系,导致序列化失败。
内容的提问来源于stack exchange,提问作者java12399900
相关产品推荐
相关产品推荐

