springdatajpa 中get××方法與find××方法的區別

垃圾繼承拖拉機發表於2020-10-26

前言

如果是資料庫中的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則立即載入,將返回到資料庫中的一行對映到實際的某個物件。

相關文章