使用SpringData创建只读存储库

2022-09-01 05:33:19

是否可以使用 Spring Data 创建只读存储库?

我有一些实体链接到视图和一些子实体,我想为它们提供一些方法的存储库,如,还有一些带有注释的方法。我想避免提供这样的方法,因为它们没有意义,可能会产生错误。findAll()findOne()@Querysave(…)delete(…)

public interface ContactRepository extends JpaRepository<ContactModel, Integer>, JpaSpecificationExecutor<ContactModel> {
    List<ContactModel> findContactByAddress_CityModel_Id(Integer cityId);

    List<ContactModel> findContactByAddress_CityModel_Region_Id(Integer regionId);

    // ... methods using @Query

    // no need to save/flush/delete
}

谢谢!


答案 1

是的,要走的路是添加一个手工制作的基本存储库。您通常使用如下内容:

public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

  T findOne(ID id);

  Iterable<T> findAll();
}

现在,您可以让刚刚定义一个的具体存储库扩展:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> {

  T findByEmailAddress(String emailAddress);
}

定义基本存储库的关键部分是,方法声明带有与声明的方法完全相同的签名,如果是这种情况,我们仍然可以将调用路由到支持存储库代理的实现Bean中。我在SpringSource博客中写了一篇关于该主题的更详细的博客文章。CrudRepository


答案 2

为了扩展Oliver Gierke的答案,在最新版本的Spring Data中,您需要在ReadOnlyRepository(父接口)上@NoRepositoryBean注释,以防止应用程序启动错误:

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

    T findOne(ID id);

    List<T> findAll();

}

推荐