MyBatis关联查询和懒加载错误

今天在写项目时遇到了个BUG。先说一下背景,前端请求更新生产订单状态,后端从前端接收到生产订单ID进行查询,然后就有问题了。

先看控制台报错:

org.apache.ibatis.executor.ExecutorException: Statement returned more than one row, where no more than one was expected.

很明显,预期查出一条记录的结果查出了多条记录。因为在实现 service 层代码时直接返回的是 DAO 对象,而 DAO 是通过 MyBatis

实现的,因此直接对 DO 设计和 MyBatis 接口实现进行排查。

核心代码如下

DO类对象

//生产订单
public class ProduceDO extends AbstractDO implements Serializable {
//生产任务
private List<OrderProduceDO> orderProduceList;
}

接口实现

<resultMap id="ProduceDO" type="com.bootdo.erp.domain.ProduceDO">
<collection property="orderProduceList" select="com.bootdo.erp.dao.OrderProduceDao.list"
javaType="com.bootdo.erp.domain.OrderProduceDO"
column="{'produceId' = id}" fetchType="lazy">
</collection>
</resultMap>
<select id="get" resultMap="ProduceDO">
select `id`,`form_Id`,`proc_Ins_Id`,`number`,`type`,`start_time`,`end_time`,`create_by`,`create_time`,`remarks`,`status`,`del_flag` from erp_produce where id = #{value}
</select>

检查了一遍关联 DO 的代码实现,并且使用数据库直接进行数据查询,没找到问题。回看接口实现,发现关联属性 orderProduceList 的类型在 DO 里和 Mybatis 中不一致,将 javaType="com.bootdo.erp.domain.OrderProduceDO" 改为 javaType="java.utils.List" 或删除该行代码(Mybatis 已对 Java 常用类型进行了映射),运行,问题解决,nice!

but,再次运行,控制台又报了一个新错误:

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory\(EnhancedResultObjectProxyImpl]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory\)EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.bootdo.common.domain.R["produce"]->com.bootdo.erp.domain.ProduceDO_$$_jvst156_0["handler"])

黑人问号??? 虚假程序员打开百度,看到了这个 Mybatis懒加载——返回前端数据 json序列化错误,意思是错误是由懒加载导致的。

解决方法:在相关类上面加上 @JsonIgnoreProperties(value = { "handler"})

@JsonIgnoreProperties(value = { "handler"})
public class ProduceDO extends AbstractDO implements Serializable
@JsonIgnoreProperties(value = { "handler"})
public class OrderProduceDO extends AbstractDO implements Serializable
@JsonIgnoreProperties(value = { "handler"})
public abstract class AbstractDO implements Serializable {

再次运行,成功!

参考博客:

Mybatis懒加载——返回前端数据 json序列化错误

Java Mybatis懒加载报错末尾显示_$$_jvst12a_0["handler"])的解决方案

MyBatis关联查询和懒加载错误的更多相关文章

  1. mybatis 嵌套查询与懒加载

    懒加载:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载. fetchType="lazy" ...

  2. mybatis(三)懒加载

    懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...

  3. Entity Framework关联查询以及数据加载(延迟加载,预加载)

    数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...

  4. mybatis分页插件以及懒加载

    1.   延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoading ...

  5. Hibernate 懒加载 错误----no session

    错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa org.hibernate.LazyI ...

  6. MyBatis 懒加载

    懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低 ...

  7. day04-MyBatis的缓存与懒加载

    为什么会用到缓存? 为了减少与数据库链接所消耗的时间,将查询到的内容放到内存中去,下次查询直接取用就ok了. 缓存的适应场景: 1.经常查询并且不经常改变的. 2.数据的正确与否对最终结果影响不大的. ...

  8. 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】

    一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Sessi ...

  9. Hibernate中的一级缓存、二级缓存和懒加载(转)

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

随机推荐

  1. 【Azure Developer】使用 CURL 获取 Key Vault 中 Secrets 中的值

    问题描述 在使用CURL通过REST API获取Azure Key Vaualt的Secrets值,提示Missing Token, 问如何来生成正确的Token呢? # curl 命令 curl - ...

  2. 杭电2091空心三角形Java(AC)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2091 把三角形写入二维数组里,然后输出出来 注意事项: 1.三角形后面没有空格(每一层的后面) 2.三角形 ...

  3. 阿里云IoT流转到postgresql数据库方案

    之前写过一篇如使用阿里云上部署.NET 3.1自定义运行时的文章,吐槽一下,虽然现在已经2022年了,但是阿里云函数计算的支持依然停留在.NET Core 2.1,更新缓慢,由于程序解包大小的限制,也 ...

  4. js call与bind和apply的区别

    介绍 在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是thi ...

  5. Nessus简单介绍与安装

    1.Nessus简单介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Ne ...

  6. 自己的~/.vimrc

    " 语法高亮syntax on " 搜索高亮set hlsearch " 显示行号set number" let mapleader="," ...

  7. ucore lab7 同步互斥机制 学习笔记

    管程的设计实在是精妙,初看的时候觉得非常奇怪,这混乱的进程切换怎么能保证同一时刻只有一个进程访问管程?理清之后大为赞叹,函数中途把前一个进程唤醒后立刻把自己挂起,完美切换.后一个进程又在巧妙的时机将自 ...

  8. 2021夏季学期华清大学EE数算OJ1:算数问题

    第一次写博客,有点紧张... 也许格式也没有特别丑吧 先看原题( 此题做法众多,这里仅仅介绍蒟蒻的一种很复杂的思路(但最后还是喜提0ms的好成绩) 读完这道题,不难发现,此题不过是一个质因数分解+一堆 ...

  9. 【网站】windows phpstudy v8.1搭建https

    这两天在搭建微擎,使用了官方推荐的一键安装环境,在搭建完站点后,想开启https. 发现如下图所示,无论关闭网站,还是关闭nginx.都无法建立https.网上也找不到相关流程,后来试着关闭nginx ...

  10. 主管发话:一周搞不定用友U8 ERP跨业务数据分析,明天就可以“毕业”了

    随着月末来临,又到了汇报总结的时刻. (图片来自网络) 到了这个特殊时期,你的老板就一定想要查看企业整体的运转情况.销售业绩.客户实况分析.客户活跃度.Top10 sales. 产品情况.订单处理情况 ...