Spring Data JPA 的getOne()和findById()区别

本文探讨了在Spring Boot应用中使用Spring Data JPA时遇到的问题,当尝试通过getOne(id)获取实体时,出现序列化异常。原因是getOne()返回的是实体对象的引用,可能导致空引用异常。解决方案是改用findById(id),返回Optional对象,然后通过Optional的get()方法安全地获取实体。如果未找到实体,不应直接调用get(),而应使用Optional的其他方法进行处理。

今天在用spring boot想实现头通过url查询一个表单数据时,在service层用getOne(id),通过id获取书单。但结果一直报错,显示

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.zph.springbootdemo.domain.Book$ HibernateProxy$FBm7bZvb[“hibernateLazyInitializer”])

表示fasterxml.jackson将对象转换为json报错,序列化的时候实体有属性为null。

在这里插入图片描述
控制台也显示了book的内容,为什么会有null值呢,为什么会序列化错误呢?我不是很懂,希望得到大神的指点
在这里插入图片描述

解决方法:
根据小布吉岛的博客介绍,
getOne() 其实质只是返回实体对象的引用,如果没有实体类存在会抛出异常

findById() 的返回值是一个Optional,在Optional类中有个get()方法,返回的是当前对象值,可以有如下的写法,如果根据该id查找不到的话,是不能直接用get()方法的。

  Optional<Book> book=bookRepository.findById(id);

        if(book.isPresent())
            return book.get();
        else
            return null;

所以将原先的getOne(id)改成findById(id).get()就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值