使用 @NoRepositoryBean 简化数据库访问

norepositorybean · 浏览次数 : 0

小编点评

**Spring Data JPA 中的 @NoRepositoryBean 注释** **问题** 在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错。开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余。 **解决方案** Spring Data JPA 提供了一个强大的解决方案:@NoRepositoryBean 注释,可以用于定义通用查询和方法,从而简化代码库并促进代码重用。 **@NoRepositoryBean注释的作用** 当应用于存储库接口时,@NoRepositoryBean 注释指示 Spring Data JPA 不要为该接口创建具体的存储库 bean。这有助于减少代码重复和提高可维护性。 **实现通用查询** 创建一个用 @NoRepositoryBean注释的基本存储库接口可以实现通用查询方法,例如: ```java @NoRepositoryBeanpublic interface BaseLibraryItemRepository<T extends LibraryItem> extends JpaRepository<T, Long> { @Query("SELECT t FROM #{#entityName} t WHERE t.library.id = :libraryId") List findAllByLibraryId(@Param("libraryId") Long libraryId); } ``` 该接口定义了一个名为 `findAllByLibraryId()` 的方法,它根据图书馆ID检索图书馆项目。 **继承通用功能** 继承通用功能的接口可以扩展Spring Data JPA 的基础功能,例如: ```java @Repositorypublic interface BookRepository extends BaseLibraryItemRepository<Book> { // Additional book-specific methods can be defined here } ``` **结果** 通过使用@NoRepositoryBean注释和继承通用功能接口,开发人员可以简化代码库,减少代码重复并提高应用程序的可维护性。

正文

在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错。开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余。幸运的是,Spring Data JPA 为这个问题提供了一个强大的解决方案:@NoRepositoryBean 注解。在本文中,我们将探讨 @NoRepositoryBean 如何允许我们在超级接口中定义通用查询和方法,然后可以由所有基本类型存储库继承,从而简化我们的代码库并促进代码重用。

问题场景

在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑通常会导致冗余代码和维护挑战。每个存储库接口可能需要类似的查询和方法,导致代码重复并降低可维护性。

理解@NoRepositoryBean

@NoRepositoryBean 注释充当 Spring Data JPA 中的标记接口。当应用于存储库接口时,它指示 Spring Data JPA 不要为该接口创建具体的存储库 bean。相反,它旨在用作其他存储库接口的超类,提供可继承的通用功能。

实体建模

在深入研究存储库之前,让我们定义图书馆管理系统的实体模型:

@Entity
public class Library {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // Other attributes of the library entity
    @OneToMany(mappedBy = "library")
    private List<LibraryItem> items;
    // Getters and setters
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class LibraryItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // Common attributes for all types of library items
    @ManyToOne
    @JoinColumn(name = "library_id")
    private Library library;
    @ManyToMany
    @JoinTable(
        name = "libraryitem_author",
        joinColumns = @JoinColumn(name = "libraryitem_id"),
        inverseJoinColumns = @JoinColumn(name = "author_id"))
    private List<Author> authors;
    // Getters and setters
}
@Entity
public class Book extends LibraryItem {
    // Additional attributes specific to books
    // Getters and setters
}
@Entity
public class ElectronicBook extends LibraryItem {
    // Additional attributes specific to electronic books
    // Getters and setters
}
@Entity
public class Magazine extends LibraryItem {
    // Additional attributes specific to magazines
    // Getters and setters
}
@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // Other attributes of the author entity
    @ManyToMany(mappedBy = "authors")
    private List<LibraryItem> libraryItems;
    // Getters and setters
}

创建通用查询

现在我们已经定义了实体模型,让我们实现一个通用查询来根据图书馆 ID 检索图书馆项目。我们将通过创建一个用 @NoRepositoryBean 注释的基本存储库接口来实现这一点:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.Query;
import java.util.List;

@NoRepositoryBean
public interface BaseLibraryItemRepository<T extends LibraryItem> extends JpaRepository<T, Long> {
    @Query("SELECT t FROM #{#entityName} t WHERE t.library.id = :libraryId")
    List<T> findAllByLibraryId(@Param("libraryId") Long libraryId);
}


在本例中,BaseLibraryItemlRepository定义了一个公共查询方法findAllByLibraryId,它根据图书馆ID检索图书馆项目。 SpEL 表达式 #{#entityName} 在运行时动态解析为与存储库关联的实体的名称。

继承通用功能

import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface BookRepository extends BaseLibraryItemRepository<Book> {
    // Additional book-specific methods can be defined here
}

类似地,ElectronicBookRepositoryMagazineRepository可以以相同的方式扩展BaseLibraryItemRepository

通过这种方法,我们有效地简化了 Spring Data JPA 应用程序中的数据库访问逻辑、减少了代码重复并提高了可维护性。

结论

总之,Spring Data JPA 中的 @NoRepositoryBean 注释为跨多个存储库接口管理数据库访问逻辑提供了强大的解决方案。通过在超级接口中定义通用功能,开发人员可以促进代码重用、减少冗余并增强应用程序的可维护性。这种方法在存储库共享相似查询和方法的场景中特别有用。通过实施此解决方案,开发人员可以简化其代码库并专注于实现特定于业务的逻辑,而无需承担重复的数据库访问代码的负担。我们创建了一个高质量的Spring技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

与使用 @NoRepositoryBean 简化数据库访问相似的内容:

使用 @NoRepositoryBean 简化数据库访问

在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错。开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余。幸运的是,Spring Data JPA 为这个问题提供了一个强大的解决方案:@NoRepositoryBean 注解

使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本。 我这里选择的是 .net framework 版本。红框里面是 实现EF Code First 需要的包。 对应的版本:

使用explain优化慢查询的业务场景分析

问:你最害怕的事情是什么? 答:搓澡 问:为什么? 答:因为有些人一旦错过,就不在了 Explain 这个词在不同的上下文中有不同的含义。在数据库查询优化的上下文中,"EXPLAIN" 是一个常用的 SQL 命令,用于显示 SQL 查询的执行计划。执行计划是数据库如何执行查询的一个详细描述,包括它将

使用Github Action来辅助项目管理

Github action 是一个Github官方提供的非常流行且速度集成 持续集成和持续交付(CI/CD)的工具。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作,包括CI/CD,并在完全定制的工作流中组合操作。 持续集成需要做

使用 GPU 进行 Lightmap 烘焙 - 简单 demo

作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很着迷。一方面,这个方案历久弥新,虽然很古老,但是一直在实际项目中都有使用;另一方面,它能够产生非常高

使用 Spring 实现控制反转和依赖注入

使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传

使用Kubesec检查YAML文件安全

使用Kubesec检查YAML文件安全,YAML文件是Kubernetes配置的主要载体,因此,检查YAML文件的安全性对于确保Kubernetes集群的安全至关重要,Kubesec简介,使用Kubesec检查YAML文件安全,kubesec scan podyamlsafe.yaml

使用Microsoft.SemanticKernel基于本地运行的Ollama大语言模型实现Agent调用函数

大语言模型的发展日新月异,记得在去年这个时候,函数调用还是gpt-4的专属。到今年本地运行的大模型无论是推理能力还是文本的输出质量都已经非常接近gpt-4了。而在去年gpt-4尚未发布函数调用时,智能体框架的开发者们依赖构建精巧的提示词实现了gpt-3.5的函数调用。目前在本机运行的大模型,基于这一

使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!

NVIDIA ® TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了计算开销...

Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

使用Flutter自带的SearchDelegate组件实现搜索界面,通过魔改实现如下效果:搜素建议、搜索结果,支持刷新和加载更多,解决IOS中文输入拼音问题。