MyBatis关联查询和懒加载错误
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 {
再次运行,成功!
参考博客:
Java Mybatis懒加载报错末尾显示_$$_jvst12a_0["handler"])的解决方案
MyBatis关联查询和懒加载错误的更多相关文章
- mybatis 嵌套查询与懒加载
懒加载:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载. fetchType="lazy" ...
- mybatis(三)懒加载
懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...
- Entity Framework关联查询以及数据加载(延迟加载,预加载)
数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...
- mybatis分页插件以及懒加载
1. 延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoading ...
- Hibernate 懒加载 错误----no session
错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa org.hibernate.LazyI ...
- MyBatis 懒加载
懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力,在一定程度上可以降低 ...
- day04-MyBatis的缓存与懒加载
为什么会用到缓存? 为了减少与数据库链接所消耗的时间,将查询到的内容放到内存中去,下次查询直接取用就ok了. 缓存的适应场景: 1.经常查询并且不经常改变的. 2.数据的正确与否对最终结果影响不大的. ...
- 【Java EE 学习 47】【Hibernate学习第四天】【sesion】【一级缓存】【懒加载】
一.Session概述 1.Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载Java 对象的方法. 2.理解Sessi ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
随机推荐
- 这3个免费PPT素材网站,一定要收藏
制作PPT,这三个网站的素材绝对够用! 1.象刀设计 https://www.101dao.com 象刀设计里面有非常多PPT模板,这个网站也是主打PPT素材. 分类很清晰,需要什么风格的素材能快速找 ...
- C# iText 7 切分PDF,处理PDF页面大小
一.itext 我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf. iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找a ...
- [操作系统]LINUX进程状态说明
R(task_running) : 可执行状态 只有在该状态的进程才可能在CPU上运行.而同一时刻可能有多个进程 处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的 ...
- 自己的~/.vimrc
" 语法高亮syntax on " 搜索高亮set hlsearch " 显示行号set number" let mapleader="," ...
- 看完复旦博士用Python统计核酸结果后,我照着也写了一个
前几天,人民日报公众号报道了复旦博士生自己写代码,通过OCR和正则表达式统计核酸截图结果.具体文章见:https://mp.weixin.qq.com/s/l8u9JifKDlRDoz32-jZWQg ...
- Focal and Global Knowledge Distillation for Detectors
一. 概述 论文地址:链接 代码地址:链接 论文简介: 此篇论文是在CGNet上增加部分限制loss而来 核心部分是将gt框变为mask进行蒸馏 注释:仅为阅读论文和代码,未进行试验,如有漏错请不吝指 ...
- uniapp中利用uni.$emit()和uni.$on()进行页面和tabbar页面传值(页面通讯)
tabbar页面 <script> export default { data() { return { list: [] , }; }, onLoad() { // 监听事件 uni.$ ...
- arts-week12
Algorithm 69. Sqrt(x) - LeetCode Review Cloudflare goes InterPlanetary - Introducing Cloudflare's IP ...
- 亿信BI——EXCEL组件使用流程
功能模块: 用户点击"excel输入"模块进行excel文件导入操作,excel导入页面的顶部导航栏包括基本属性.文件设置.格式设置和字段列表四部分. 基础属性: 在基本属性模块部 ...
- 【单片机】CH32V103C8T6 ——窗口看门狗
本章教程通过串口调试助手打印显示程序运行状态,具体现象如下: 若计数器值在上窗口值和下窗口值0X40之间的时候,进行喂狗操作,计数器重新计数,程序正常运行,串口打印显示:The program run ...