Spring Data JPA的持久層

1.概述

本文將重點介紹Spring 3.1,JPA和Spring Data的持久層的配置和實現。 有關使用基于Java的配置和項目的基本Maven pom設置Spring上下文的分步介紹,請參閱本文 。

持久性與春天 系列 :

  • 第1部分 – 具有Spring 3.1和Hibernate的持久層
  • 第2部分 – 使用Spring和Java泛型簡化數據訪問層
  • 第3部分 – 具有Spring 3.1和JPA的持久層
  • 第4部分 – 使用Spring Data JPA的持久層
  • 第5部分 – 使用JPA和Spring 3.1進行事務配置

2.沒有更多的DAO實現

如前一篇文章中所討論的, DAO層通常包含許多可以并且應該簡化的樣板代碼。 這種簡化的優點有很多方面:減少需要定義和維護的工件數量,簡化和簡化數據訪問模式并保持配置一致性。

Spring Data將這一簡化向前邁了一步,并且有可能完全刪除DAO實現-DAO的接口現在是唯一需要明確定義的工件。

3. Spring Data管理的DAO

為了開始通過JPA使用Spring Data編程模型,DAO接口需要在Spring的接口層次結構中擴展JPA特定的Repository接口– JpaRepository 。 這將使Spring Data能夠找到該接口并為其自動創建一個實現。

此外,通過擴展接口,我們可以獲得DAO中可用的大多數(即使不是全部)相關的CRUD通用方法來進行標準數據訪問。

4.定義自定義訪問方法和查詢

如上所述,通過實現存儲庫接口之一,DAO將已經定義和實現了一些基本的CRUD方法(和查詢)。 為了定義更具體的訪問方法,Spring JPA支持許多選項–您可以在界面中簡單地定義一個新方法 ,或者可以使用@Query注釋提供實際的JPQ查詢

定義自定義查詢的第三個選項是使用JPA命名查詢,但這具有以下缺點:要么涉及XML,要么使查詢負擔域類。

除了這些之外,Spring Data 引入了更靈活和方便的API,類似于JPA Criteria API,只是更具可讀性和可重用性。 當處理大量固定查詢時,此API的優勢將變得更加明顯,這些固定查詢可以通過較少數量的可重復使用的塊(以不同的組合形式不斷出現)來更簡潔地表達。

4.1。 自動自定義查詢

當Spring Data創建一個新的Repository實現時,它會分析接口定義的所有方法,并嘗試根據方法名自動生成查詢。 盡管這有局限性,但它是一種非常有用且優雅的方法,可以輕松定義新的自定義訪問方法。

例如,如果管理實體具有名稱字段(以及該字段的Java Bean標準getter和setter),則在DAO接口中定義findByName方法將自動生成正確的查詢:

public interface IFooDAO extends JpaRepository< Foo, Long >{Foo findByName( final String name );}

這是一個相對簡單的例子。 查詢創建機制支持更多的關鍵字集 。

如果解析器無法將該屬性與域對象字段匹配,則會引發以下異常:

java.lang.IllegalArgumentException:未為類型類org.rest.model.Foo找到屬性nam

4.2。 手動自定義查詢

除了從方法名稱派生查詢外,還可以使用方法級別@Query注釋手動指定自定義查詢。

為了對查詢的創建進行更精細的控制,例如使用命名參數或修改現有查詢, 該參考是一個不錯的起點。

5. Spring Data事務配置

Spring Data托管DAO的實際實現-SimpleJpaRepository-使用注釋來定義和配置事務 。 在類級別使用只讀@Transactional批注,然后將其替換為非只讀方法。 其余的事務語義是默認的,但是可以很容易地按方法手動覆蓋它們。

5.1。 沒有模板的異常翻譯

Spring ORM模板( JpaTemplateHibernateTemplate )的職責之一是異常轉換 -將JPA異常(將API與JPA關聯) 轉換為Spring的DataAccessException層次結構。

沒有模板可以執行此操作,仍然可以通過使用@Repository批注對DAO進行批注來啟用異常轉換。 結合使用Spring bean后處理器,將為所有@Repository bean提供在Container中找到的PersistenceExceptionTranslator的所有實現–無需使用模板即可提供異常轉換。

異常轉換確實有效的事實可以通過集成測試輕松驗證:

@Test( expected = DataAccessException.class )
public void whenAUniqueConstraintIsBroken_thenSpringSpecificExceptionIsThrown(){String name = "randomName";service.save( new Foo( name ) );service.save( new Foo( name ) );
}

異常翻譯是通過代理完成的; 為了使Spring能夠圍繞DAO類創建代理,不得將它們聲明為final

6. Spring數據配置

為了激活Spring JPA存儲庫支持,定義了jpa命名空間并將其用于指定DAO接口所位于的包:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsd"><jpa:repositories base-package="org.rest.dao.spring" /></beans>

在這一點上,沒有等效的基于Java的配置–然而,對它的支持正在進行中 。

7. Spring Java或XML配置

該系列的上一篇文章已經詳細討論了如何在Spring 3中配置JPA 。 Spring Data還利用了對JPA @PersistenceContext批注的Spring支持,該批注用于將EntityManager連接到負責創建實際DAO實現的Spring工廠bean – JpaRepositoryFactoryBean

除了已經討論過的配置之外,還有最后一個缺失的部分–包括整體持久性配置中的Spring Data XML配置:

@Configuration
@EnableTransactionManagement
@ImportResource( "classpath*:*springDataConfig.xml" )
public class PersistenceJPAConfig{...
}

8. Maven配置

除了上一篇文章中定義的JPA的Maven配置之外,還添加了spring-data-jpa依賴項:

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.3.2.RELEASE</version>
</dependency>

9.結論

本文介紹了使用基于XML和Java的配置以及Spring 3.1,JPA 2和Spring JPA(屬于Spring Data傘項目的一部分)的持久層的配置和實現。 討論了定義更高級的自定義查詢的各種方法,以及使用新的jpa名稱空間和事務語義的配置。 最終結果是對Spring進行數據訪問的一種新穎而優雅的方式,幾乎沒有實際的實現工作。 您可以在github項目中查看完整的實現。

參考: baeldung博客中來自JCG合作伙伴 Eugen Paraschiv的帶有Spring Data JPA的持久層 。

翻譯自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-data-jpa.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言開發筆記(三)自加和自減

看到一段代碼&#xff0c;被坑了。 #include <stdio.h>int main(void) {int a 7;printf("%d\n", a);printf("%d\n", a--);printf("%d\n", -a);printf("%d\n", -a--);printf("%d\n", a);return 0; } 結果為 -a的邏輯…

求解數獨回溯算法

實現的java代碼如下&#xff08;該算法只是將結果打印輸出&#xff0c;并沒有對原數組實現更改&#xff09;&#xff1a; //判斷a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判斷是否跟同行沖突for(int j10;j1<9;j1){if(a[i][j1]val…

python語言屬于哪一種語言_Python與Java:你應該學習哪種語言,他們有什么區別?...

在企業招聘中&#xff0c; Python和Java經常是需求最大的編程語言。這兩種編程功能強大&#xff0c;靈活且面向對象的語言&#xff0c;通常在組織中和各種其他設置中使用。這可能會導致我們提出一個不可避免的問題&#xff1a;哪個更好&#xff1f; 這是一個復雜的問題&#xf…

關于手機端CSS Sprite圖標定位的一些領悟

今天在某個群里面閑逛&#xff0c;看見一個童鞋分享了一個攜程的移動端的頁面。地址這里我也分享下吧&#xff1a;http://m.ctrip.com/html5/在手機端我都很少用雪碧圖合并定位圖標&#xff0c;用的比較多就是用字體圖標來代替&#xff0c;有些圖標不多的時候就自己單個的切出來…

將Java向前推進? 一個定義。 一年回顧。

這篇文章是許多其他“年終”博客文章和評論之一。 但這并不是這樣。 我正在嘗試總結我在2011年所學到的有關Oracle和Java的知識&#xff0c;還試圖解釋“將Java向前推進”對我的意義以及我認為應該更好或更簡單地改變的東西。 感謝您全年關注我的博客&#xff0c;也感謝您在Twi…

c語言程序源代碼_程序的編譯、鏈接和執行

同學們總是抱怨每次見到一道面試題都很難把它轉化為程序源代碼。然而不幸的是&#xff0c;即使是程序源代碼對于計算機來說也還是太高級了。要想讓計算機執行一段程序&#xff0c;我們必須把它翻譯成最底層的機器指令才行。這其中要經歷很多步驟。幸運的是有很多現成的工具可以…

Ubuntu下tftp服務器的搭建

參考博客&#xff1a;http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配…

【程序員眼中的統計學(1)】信息圖形化:第一印象

信息圖形化&#xff1a;第一印象 作者 白寧超 2015年10月13日23:23:13 摘要&#xff1a;程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學&#xff0c;很多人認為是經濟學或者數學的專利&#xff0c;與計算機并沒有交集。誠然在傳統學科中&#xff0c;其…

JBoss AS 7.0.2“ Arc”發布–使用綁定選項

有關JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已經發布&#xff01; 自AS 7.0.1發布以來已經過去了一個月。 在這短時間內&#xff0c;已修復了許多錯誤&#xff0c;并實現了更多功能和改進。 所有這些錯誤修復和功能已包含在此7.0.2版本中。 此新版本主要包…

C語言開發筆記(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代碼為什么會運行錯誤&#xff0c;異常退出&#xff1f; 這段代碼是新手常見錯誤之一。 定義…

不屬于python標準庫的是_python標準庫和擴展庫

Tkinter ———— Python 默認的圖形界面接口。 Tkinter 是一個和 Tk 接口的模塊&#xff0c; Tkinter 庫提供 了對 Tk API 的接口&#xff0c;它屬于 Tcl/Tk 的 GUI 工具組。 Tcl/Tk 是由 John Ousterhout 發展的書寫和 圖形設備。 Tcl( 工具命令語言 ) 是個宏語言&#xff0c…

Android N 新特性 + APP開發注意事項

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;這是Android N里對開發者影響比較大的特性&#xff0c;也是大家疑問比較多的地方。站在開發者的角度其實不必太擔心這個特性會導致我們需要修改很多代碼來適配系統。Google的工程師們也不希望這個特性導致很多應用出現問題&…

C語言開發筆記(六)實參和形參

舉例說明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }結果為 在函數調用時&#xff0c;a的值傳給x&#xff0c;b的值傳給y。執行完…

Spring Singleton,請求,會話Bean和線程安全

由眾多有用框架組成的Spring框架生態系統已成為許多Java EE應用程序的基礎。 但是在所有Spring產品的核心中&#xff0c;我們仍然擁有Spring DI / IOC框架&#xff0c;該框架將Spring推向了新的高度。 隨著越來越多的人將Spring MVC或JSF-Spring集成用于他們的應用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.瀏覽器前綴&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3過渡動畫&#xff1a;transitio…

面試之ajax原理(轉載)

總結1 總結2 AJAX全稱為“Asynchronous JavaScript and XML”&#xff08;異步JavaScript和XML&#xff09;&#xff0c;是一種創建交互式網頁應用的網頁開發技術&#xff0c; 是幾種原有技術的結合體。它由下列技術組合而成。 1.使用CSS和XHTML來表示。 2. 使用DOM模型來交互和…

優化方案電子版_關于小區分支道路整修設計方案的討論稿(No.2020121)

各位業主&#xff0c;大家好&#xff01; 關于綠洲比華利花園主干道翻新和次干道整修前期勘查和設計方案&#xff0c;經業委會及小區專家小組、設計單位申都設計公司工程設計人員結合本小區的實際情況進行了深入討論&#xff0c;優化設計&#xff0c;形成如下三個獨立方案&…

OSGI和Spring動態模塊–簡單的Hello World

在此姿勢中&#xff0c;我們將采用使用OSGi進行的第一個實現&#xff0c;并使用Spring Dynamic Modules改進應用程序。 Spring動態模塊&#xff08;Spring Dm&#xff09;使基于OSGi的應用程序的開發更加容易。 這樣&#xff0c;服務的部署就容易得多。 您可以像其他任何Spring…

C語言代碼規范(五)函數參數個數

一個函數的參數的數目過多&#xff08;尤其是超過8個&#xff09;顯然是一種不可取的編程風格。參數的數目直接影響調用函數的速度&#xff0c;參數越多&#xff0c;調用函數越慢。 參數的數目少&#xff0c;程序就顯得精練、簡潔&#xff0c;這有助于檢查和發現程序中的錯誤。…

vijos P1740 聰明的質檢員

題目鏈接:傳送門 題目大意:給你n個物品&#xff0c;每件物品有重量 W 和價值 V&#xff0c;給m個區間&#xff0c;和一個標準值。(n,m最大200000) 要求找到一個值x&#xff0c;使得m個所有區間的權值和與標準值的差的絕對值最小。單個區間權值計算公式(數目num0&#xff0c;價值…