你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / 数据库开发
Jackson的@JsonIdentityInfo注解和mybatis等orm框架的循环嵌套问题的解决方法
 

我也遇到这个问题,报错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报错是不是因为一个类的代理对象只有一个,导致多个对象不能很好区分导致的循环问题?

以上是根据能得到信息做出的一些假设和判断,如有错误,跪求指正。

  推荐精品文章

·黑客频频攻击区块链安全软肋,如何保证区…
·阿里、商汤在香港设立人工智能实验室 本月…
·云端的竞争:巨头纷纷加码云市场
·中国云体系联盟主办未来科技独角兽与行业…
·Gartner:企业首席信息官们可能没有注意到…
·微软开源Azure云服务AI引擎Infer.NET
·创新指纹读取器出炉:平均准确率最高可达…
·微软投资东南亚出行公司Grab 将进行AI等技…
·Facebook开发AI系统:看美食图片能自动生…
·工信部:促进区块链与实体经济深度融合
·谷歌首度证实了重返中国的Dragonfly计划的…
·Java 11正式发布,告诉你到底应不应该升级…
·Stack Overflow 10 周年了,作为程序员你…
·新手初学Python最常犯的十个错误,其中有…

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备06048724号,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区长春桥路5号6号楼1209室,邮编:100089