我也遇到这个问题,报错com.fasterxml.jackson.databind.JsonMappingException: Direct self-reference leading to cycle,使用了Jackson的@JsonIdentityInfo注解到实体类上解决的。
@JsonIdentityInfo
2.0+版本新注解,作用于类或属性上,被用来在序列化/反序列化时为该对象或字段添加一个对象识别码,通常是用来解决循环嵌套的问题,比如数据库中的多对多关系,通过配置属性generator来确定识别码生成的方式,有简单的,配置属性property来确定识别码的名称,识别码名称没有限制。
初步分析是orm框架在把实体类和数据库映射的过程中产生了循环问题(但是我的实体类只有一个,没有两个类互相引用,可能是其他表的带来的自引用,比如一个用户关注另一个用户,待探究),
在映射(我也不懂为什么这里要持久化,orm框架需要这样做吗?但这是唯一能循环的地方了)我的联表查询操作(user和concern,用户表和关注关系表)的过程中,由于外键导致的自引用,使得user的实体类对象(应该是代理)自己引用了自己,这里应该是两个不同的外键代表的两个不同用户之间的关系,但是mybatis代理类的对象却无法区分这种关系,导致了自引用的循环。
也是这也是为什么加上了Jackson的识别码之后导致问题被解决。
疑惑的地方在于:
1、mybatis查询返回的是否是自己产生的代理user对象?
2、用户表和关系表在这里构成了一种循环,自引用,(虽然只是外键)虽然后来加上了序列号问题解决了,但是序列号没有改变这种本质的循环关系,这种关系是否有问题?mybatis是怎么处理这种自引用的?
3、问题是用@JsonIdentityInfo注解解决的,说明orm框架在某个地方进行序列化得时候无法准确识别对象,这是在哪一步?为什么需要序列化这个对象?
4、循环嵌套指的是哪个地方的循环?如果不嵌套,只是主外键关系还有这种问题吗?
5、orm报错是不是因为一个类的代理对象只有一个,导致多个对象不能很好区分导致的循环问题?
以上是根据能得到信息做出的一些假设和判断,如有错误,跪求指正。
|