Spring Data JPA的內部原理

2021-10-18 02:28:56 字數 1200 閱讀 2022

在參會人員的案例中,我們發現在自定義的gsmeetinguserdao 中,並沒有提供任何方法就可以使用其中的很多方法,那麼這些方法究竟是怎麼來的呢?答案很簡單,對於我們自定義的dao介面,由於繼承了jparepository和jpaspecificationexecutor,所以我們可以使用這兩個介面的所有方法。

在使用spring data jpa時,一般實現jparepository和jpaspecificationexecutor介面,這樣就可以使用這些介面中定義的方法,但是這些方法都只是一些宣告,沒有具體的實現方式,那麼在 spring data jpa中它又是怎麼實現的呢?

通過案例,以debug斷點除錯的方式,通過分析spring data jpa的原來來分析程式的執行過程,我們以findone方法為例進行分析

斷點執行到方法上時,我們可以發現注入的gsmeetinguserdao物件,本質上是通過jdkdynamicaopproxy生成的乙個**物件

當程式執行的時候,會通過jdkdynamicaopproxy的invoke方法,對gsmeetinguserdao物件生成動態**物件。根據對spring data jpa介紹而知,要想進行findone查詢方法,最終還是會出現jpa規範的api完成操作,那麼這些底層**存在於何處呢?答案很簡單,都隱藏在通過jdkdynamicaopproxy生成的動態**物件當中,而這個動態**物件就是******jparepository

通過******jparepository的原始碼分析,定位到了findone方法,在此方法中,返回em.find()的返回結果,那麼em又是什麼呢?

帶著問題繼續查詢em物件,我們發現em就是entitymanager物件,而他是jpa原生的實現方式,所以我們得到結論spring data jpa只是對標準jpa操作進行了進一步封裝,簡化了dao層**的開發

spring data jpa遇到的坑

1 column註解name最好全寫了,不然遇到像hibernate駝峰和下劃線風格配置變更時會出現找不到屬性,尤其開啟自動建表情況 2 唯讀操作情況,如果對讀取物件進行了屬性修改操作,那麼jpa會認為你要修改這個實體,使用hibernate的情況下回預設執行乙個update的sql,然後你懂得由於...

spring Data Jpa的分頁管理

通過jpa大大簡化了我們對資料庫的開發工作。但是,之前的例子中我們只提到了最簡單的crud 增刪改查 操作。實際上,spring data jpa對於分頁以及排序的查詢也有著完美的支援,接下來,我們來學習如何通過pageable來對資料庫進行分頁查詢。一 pageable 是spring data庫...

SpringData Jpa中count的使用

通常,我們會有統計數量的需求,jpa對一些簡單統計數量的需求通過方法名就可以解析。然而對於稍微複雜的需求則無法通過方法名解析。對於這種需求,還是需要寫sql實現。當我的repository介面繼承jparepository時,缺省會繼承它的乙個count 方法 crudrepository介面中有c...