【Spring连载】使用Spring Data的Repositories----定义Repository接口

【Spring连载】使用Spring Data的Repositories----定义Repository接口

  • 一、微调Repository定义
  • 二、使用多个Spring Data模块的Repositories

要定义repository接口,首先需要定义特定于域(domain)类的repository接口。接口必须继承Repository,并且类型为域类和ID类型。如果你想公开该域类型的CRUD方法,可以继承CrudRepository或其变体之一,而不是Repository。

一、微调Repository定义

有几种变体可以帮助你开始使用repository接口。
典型的方法是继承CrudRepository,它为你提供了CRUD功能的方法。CRUD代表创建、读取、更新、删除。在3.0版本中,框架还引入了ListCrudRepository,它与CrudRepository非常相似,但对于那些返回多个实体的方法,它返回的是List,而不是Iterable,你可能会发现它更容易使用。
如果你使用的是反应式(reactive )存储,根据你使用的反应式框架,你可以选择ReactiveCrudRepository或RxJava3CrudRepository。
如果你正在使用Kotlin,您可以选择利用Kotlin协程的CoroutineCrudRepository。
此外,如果你需要允许指定排序抽象的方法,或者在第一种情况下是可分页抽象,则可以继承PagingAndSortingRepository、ReactiveSortingRepository、RxJava3SortingRepository或CoroutineSortingRepository。请注意,各种排序存储库不再像在Spring Data Versions 3.0之前那样扩展各自的CRUD repository。因此,如果您想要两个接口的功能,就需要继承这两个接口。
如果你不想继承Spring Data接口,也可以使用@RepositoryDefinition注解repository接口。继承其中一个CRUD存储库接口将公开一整套操作实体的方法。如果你希望对公开的方法有选择性,请将要公开的方法从CRUD repository复制到你的域repository中。这样做时,你可以更改方法的返回类型。如果可能的话,Spring Data将采用返回类型。例如,对于返回多个实体的方法,你可以选择Iterable, List, Collection或VAVR列表。
如果应用程序中的许多存储库应该具有相同的方法集,则可以定义自己的基本接口以从中继承。这样的接口必须用@NoRepositoryBean进行注解。这防止了Spring Data尝试直接创建它的实例导致失败,因为它无法确定该存储库的实体,因为它仍然包含一个泛型类型变量。
以下示例展示了如何选择性地公开CRUD方法(在本例中为findById和save):
选择性地公开CRUD方法

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {Optional<T> findById(ID id);<S extends T> S save(S entity);
}interface UserRepository extends MyBaseRepository<User, Long> {User findByEmailAddress(EmailAddress emailAddress);
}

在前面的示例中,你为所有域存储库定义了一个通用的基本接口,并公开了findById(…)和save(…)。这些方法被路由到Spring Data提供的、你选择的存储的基本存储库实现中(例如,如果你使用JPA,则实现为SimpleJpaRepository),因为它们与CrudRepository中的方法签名匹配。因此,UserRepository现在可以保存用户,通过ID查找单个用户,并触发查询以通过电子邮件地址查找用户。
中间(intermediate)存储库接口用@NoRepositoryBean进行注释。确保将该注解添加到所有不需要Spring Data在运行时为其创建实例的存储库接口中。

二、使用多个Spring Data模块的Repositories

在应用程序中使用唯一的Spring Data模块使事情变得简单,因为定义的范围中的所有存储库接口都绑定到Spring Data模块。有时,应用程序需要使用多个Spring Data模块。在这种情况下,存储库定义必须区分持久化技术。当Spring Data在类路径上检测到多个存储库工厂时,它将进入严格的(strict )存储库配置模式。严格的配置使用存储库或域类的详细信息来决定存储库定义的Spring Data模块绑定:

  1. 如果存储库定义继承了特定于模块的存储库,则它是特定Spring Data模块的有效候选者。
  2. 如果域类使用特定于模块的类型注解进行注解,则它是特定Spring Data模块的有效候选者。Spring Data模块接受第三方注解(如JPA的@Entity)或提供自己的注解(如Spring Data MongoDB和Spring Data Elasticsearch的@Document)。
    以下示例展示了一个使用模块特定接口(本例中为JPA)的存储库:

例1:使用特定于模块的接口的存储库定义

interface MyRepository extends JpaRepository<User, Long> { }@NoRepositoryBean
interface MyBaseRepository<T, ID> extends JpaRepository<T, ID> {}interface UserRepository extends MyBaseRepository<User, Long> {}

MyRepository和UserRepository在它们的类型层次结构中继承JpaRepository 。它们是Spring Data JPA模块的有效候选者。
下面的例子展示了一个使用通用接口的存储库:
例2:使用通用接口的存储库定义

interface AmbiguousRepository extends Repository<User, Long> {}@NoRepositoryBean
interface MyBaseRepository<T, ID> extends CrudRepository<T, ID> {}interface AmbiguousUserRepository extends MyBaseRepository<User, Long> {}

AmbiguousRepository和AmbiguousUserRepository在它们的类型层次结构中只扩展Repository和CrudRepository。虽然在使用唯一的Spring Data模块时这很好,但多个模块无法区分这些存储库应该绑定到哪个特定的Spring Data。下面的示例展示了一个使用带注释的域类的存储库:
例3:使用带注释的域类的存储库定义

interface PersonRepository extends Repository<Person, Long> {}@Entity
class Person {}interface UserRepository extends Repository<User, Long> {}@Document
class User {}

PersonRepository引用了Person,它是用JPA@Entity注解的,所以这个存储库显然属于Spring Data JPA。UserRepository引用了User,它用Spring Data MongoDB的@Document进行了注解。
以下错误示例显示了一个使用带有混合注释的域类的存储库:
例4:使用具有混合注释的域类的存储库定义

interface JpaPersonRepository extends Repository<Person, Long> {}interface MongoDBPersonRepository extends Repository<Person, Long> {}@Entity
@Document
class Person {}

这个例子展示了一个同时使用JPA和Spring Data MongoDB注解的域类。它定义了两个存储库,JpaPersonRepository和MongoDBPersonRepository。一个用于JPA,另一个用于MongoDB。Spring Data不能区分存储库,这导致了未定义的行为。
存储库类型详细信息(前述例1)和区分域类注解(前述例3)用于严格的(strict)存储库配置,以识别特定Spring Data模块的候选存储库。在同一域类型上使用多个特定于持久性技术的注解是可能的,并且可以跨多种持久性技术重用域类型。但是,Spring Data无法再确定用于绑定存储库的唯一模块。
区分存储库的最后一种方法是确定存储库基本包(base packages)的范围。基本包定义了扫描存储库接口定义的起点,这意味着存储库定义位于适当的包中。默认情况下,注解驱动的配置使用配置类的包。基于XML的配置中的基本包是必需的。
以下示例展示了基本包的注解驱动配置:
基本包的注解驱动配置

@EnableJpaRepositories(basePackages = "com.acme.repositories.jpa")
@EnableMongoRepositories(basePackages = "com.acme.repositories.mongo")
class Configuration {}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.openEuler操作系统网络管理和防火墙(二)

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 3.通过IP命令配置网络 配置IP地址: 使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名…

一文7个步骤教你搭建测试web测试项目实战环境

​今天小编&#xff0c;给大家总结下web 测试实战的相关内容&#xff0c;一起来学习下吧&#xff01; web项目实战可按顺序依次为&#xff1a;【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】…

广东珠宝行业为什么要开展珠宝神秘顾客调查呢?

在竞争激烈的珠宝市场中&#xff0c;品牌形象、服务质量以及顾客满意度是决定一个企业成功与否的关键因素。为了更好地了解顾客需求&#xff0c;优化服务流程&#xff0c;提升顾客满意度&#xff0c;珠宝行业开展神秘顾客调查显得尤为重要。以下从几个方面详细阐述珠宝行业为何…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志&#xff0c;redo日志的功能就是把增删改操作都记录着&#xff0c;如果断电导致内存中的脏页丢失&#xff0c;可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性&#xff0c;undo日志设计出来是为…

AI 绘画:人工智能绘画之美

人工智能&#xff08;AI&#xff09;是当今科技领域的热门话题&#xff0c;它不仅可以帮助我们解决各种复杂的问题&#xff0c;还可以创造出令人惊叹的艺术作品。AI 绘画是一种利用 AI 技术生成图像的方法&#xff0c;它可以模仿不同的风格、主题和技巧&#xff0c;甚至可以创造…

Qt Linux下调用OpenGL的glu.h报错:error: GL/glu.h: No such file or directory

Qt Linux下调用OpenGL的glu.h报错&#xff1a;error: GL/glu.h: No such file or directory 引言一、问题描述二、解决方案三、解决过程记录3.1 定位问题3.2 尝试使用yum命令安装3.3 从网上下载到本地进行安装 引言 在Windows上正常运行的OpenGL程序&#xff0c;到Linux下突然…

cuda学习笔记(2)

一 专业名词 1 分支断定 2 一致性和同一性 3 常见名词汇总 4 加速比 二 GPU架构构述 GPU就是将cpu的数据存储单元去掉&#xff0c;也就是保留执行单元&#xff0c;GPU就是多个执行单元 1 GPU设计思路&#xff0c;指令流共享&#xff0c;同时执行&#xff0c;数据切分成小块 …

四种主流的prompt框架

省流版&#xff1a; 文章介绍了在使用GPT时的四种prompt框架&#xff0c;有利于使用者打磨提问风格&#xff0c;与GPT进行更好的交互以提高生产力&#xff0c;能帮助大家有效提高工作效率~ 创作不易&#xff0c;如果对你有帮助的话&#xff0c;还请三连支持~ 想要使用Prompt…

MySQL的21个SQL经验

1. 写完SQL先explain查看执行计划(SQL性能优化) 日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。 explain select userid,name,age from user where userid =10086 or age =18;2、操作delete或者update语句,加个limit(S…

jQuery简介与解析 - 掌控网页互动的魔法工具

jQuery简介与解析 - 掌控网页互动的魔法工具 摘要&#xff1a;本文将带您了解jQuery这一强大且流行的JavaScript库&#xff0c;探讨其特点、优势以及如何在网页开发中发挥巨大作用。我们将从jQuery的基本概念入手&#xff0c;逐步深入解析其核心功能&#xff0c;助您轻松掌握这…

phpspreadsheet导出数据和图片到excel

仅作记录&#xff0c;废话不多说 前提是已经安装了phpspreadsheet &#xff08; composer require phpoffice/phpspreadsheet &#xff09; 一、 数据拼装&#xff0c;调用excel类 <?php /*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controlle…

Android 面试问题 2024 版(其三)

Android 面试问题 2024 版&#xff08;其三&#xff09; 十一、版本控制十二、Play 商店和应用程序部署十三、无障碍十四、第三方库和 API十五、解决问题的能力十六、基于 JD 的非常高级别的问题 十一、版本控制 什么是版本控制&#xff0c;为什么它在软件开发中很重要&#x…

Shell echo、printf、test命令

目录 Shell echo命令 打印文本消息 显示变量值 输出特殊字符 输出到文件 追加到文件 Shell printf 命令 打印简单文本 Shell test 命令 文件测试 字符串比较 整数比较 逻辑运算 Shell echo命令 打印文本消息 echo "Hello, World!" 显示变量值 name&q…

积累:如何提取 int 数据的高低字节

前言 服务通信、硬件开发&#xff0c;一般都会涉及到字节数据的解析、处理。无论是两个服务间的数据交互协议&#xff0c;还是硬件设备的通信协议&#xff0c;协议中涉及到的参数比较多&#xff0c;并且协议中每个参数占用的字节大小设定会因功能也不尽相同&#xff1a;简单点的…

微信小程序(4)- 事件系统和模板语法

1. 事件系统 1.1 事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代…

抖店货源怎么找?这几个货源渠道,我都替你整理出来了!

我是电商珠珠 在开通抖店之后&#xff0c;怎么找货源成为了新手的致命要点。货源找不好&#xff0c;就会导致店铺的流量曝光不够。 抖店货源究竟该怎么找呢&#xff0c;今天我就来给大家说个明白。 1、货源网站 比较常规的方式&#xff0c;就是去货源网站上去找&#xff0c…

LeetCode //C - 131. Palindrome Partitioning

131. Palindrome Partitioning Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Example 2…

达梦数据库——集群守护进程各状态详解

守护进程&#xff08; dmwatcher &#xff09;是 DM 数据守护系统不可或缺的核心部件&#xff0c;是数据库实例和 监视器之间信息流转的桥梁。数据库实例向本地守护进程发送信息&#xff0c;接收本地守护进程的消 息和命令&#xff1b;监视器&#xff08; dmmonitor &#…

爬某网站延禧宫率第一集视频

import requests import re from tqdm import tqdm # 网址链接&#xff1a;https://v.ijujitv.cc/play/24291-1-1.html url https://v6.1080pzy.co/20220801/urxniJCN/hls/index.m3u8 headers {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Appl…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下&#xff1a; N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…