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

前言

如果是数据库中的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则立即加载,将返回到数据库中的一行映射到实际的某个对象。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页