springdatajpa 中get××方法与find××方法的区别

本文探讨了Spring Data JPA中getOne与findById方法的区别,getOne使用延迟加载,仅在真正访问属性时才访问数据库;而findById则立即加载实体。getOne在实体不存在时会抛出异常,而findById则返回null。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

如果是数据库中的delete,update和insert操作,则不需要显式的在Repository的子接口中定义方法。

具体可以去中文论坛查找相关资料。下面主要讨论select操作时get和find的区别。

下面列举的就是springdatajpa的官方文档内容。

 

getOne()方法

getOne()返回对具有给定标识符的实体的引用。getOne在内部调用EntityManager.getReference()方法。根据文档,此方法将始终返回代理,而不会访问数据库(延迟获取)。如果请求的实体在数据库中不存在,则此方法在实际访问时将引发EntityNotFoundException

findById()方法

该方法实际上将命中数据库,并将实际对象映射返回到数据库中的一行。如果数据库中没有记录,则是EAGER加载的操作返回null

这些方法之间的唯一真正区别在于性能。延迟加载的getOne()方法避免了从JVM进行数据库往返,因为在真正访问返回的代理对象的属性之前,它从不访问数据库。

 

注:某中文论坛上有人说,用getOne取得这个对象,加断点看一下这个对象是个hibernate的代理对象,而不是实体,里面基本没有值。然后换成findOne试了一下,断点查看这个取出来的对象,这个对象是实体,关联也有。

 

总结

1.get方法select不到数据则报错,find方法select不到数据则返回null。

2.get延迟加载,在真正访问返回的代理对象的属性之前,它从不访问数据库。find则立即加载,将返回到数据库中的一行映射到实际的某个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值