你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / 数据库开发
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报错是不是因为一个类的代理对象只有一个,导致多个对象不能很好区分导致的循环问题?

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

  推荐精品文章

·2018年最流行的十大编程语言,其中包括你…
·物联网要有自己的网络的五大原因
·清华人工智能研究院今日成立 张钹姚期智坐…
·人工智能危机前,孩子具备这三种素质就能…
·华为云打造EI智能体,推动“普惠AI”再进…
·2018年6月目录  
·微软秘密开发云计算AI芯片 提升云业务服务…
·为保护开源项目被合理使用 红帽变更其开源…
·这个新品牌能止住SaaS领域不断传来的坏消…
·微软引入SwiftKey输入法 或为可折叠设备做…
·借助AI技术 2.5亿设备已升级至最新Win10
·云市场再添新玩家 新华网获得云服务牌照
·北欧五国发布5G合作宣言 推动五国成首个5…
·欧盟吸纳52名专家入AI咨询委员会 将起草A…

  联系方式
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