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