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.mzph.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;价值…