使用Spring Data创建只读存储库 | Baeldung


在这个简短的教程中,我们将讨论如何创建一个只读的Spring Data Repository。
有时有必要从数据库中读取数据而无需修改它(CQRS)。在这种情况下,拥有只读的Repository接口将是完美的。它将提供读取数据的功能,而无需任何人更改它的风险。
 
让我们从一个包含spring-boot-starter-data-jpa依赖项的Spring Boot项目开始:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.4.3</version>
</dependency>

Spring Data受欢迎的CrudRepository接口包含在此依赖项中,该接口提供了大多数应用程序所需的所有基本CRUD操作(创建,读取,更新,删除)的方法。但是,它包含几种修改数据的方法,我们需要一个只能读取数据的存储库。
CrudRepository实际上扩展了另一个称为Repository的接口。我们还可以扩展此接口以满足我们的需求。
让我们创建一个扩展Repository的新接口:

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID> extends Repository<T, ID> {
    Optional<T> findById(ID id);
    List<T> findAll();
}

在这里,我们仅定义了两个只读方法。此存储库访问的实体将不受任何修改的影响。
还必须注意,我们必须使用@NoRepositoryBean批注来告诉Spring我们希望该存储库保持通用性,这一点也很重要。这使我们可以根据需要将只读存储库重用于许多不同的实体。
接下来,我们将看到如何将实体绑定到我们的新ReadOnlyRepository。
 
假设我们有一个简单的Book实体,我们想访问它:
@Entity
public class Book {
    @Id
    @GeneratedValue
    private Long id;
    private String author;
    private String title;

    //getters and setters
}

现在我们有了一个可持久的实体,我们可以创建一个继承自ReadOnlyRepository的存储库接口:

public interface BookReadOnlyRepository extends ReadOnlyRepository<Book, Long> {
    List<Book> findByAuthor(String author);
    List<Book> findByTitle(String title);
}

 
我们学习了如何扩展Spring Data的Repository接口,以创建可重用的只读存储库。之后,我们将其绑定到一个简单的Book实体,并编写了一个测试,证明了其功能符合我们的预期。
与往常一样,可以在GitHub上找到此代码的有效示例。