提问者:小点点

使用SpringData创建只读存储库


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

我有一些链接到视图的实体和一些子实体,我想为它们提供一个存储库,其中包含一些方法,如findAll()findOne()和一些带有@Query注释的方法。我想避免提供像保存(…)删除(…)这样的方法,因为它们没有意义并且可能会产生错误。

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
}

谢谢!


共3个答案

匿名用户

是的,要做的就是添加一个手工制作的基础存储库。您通常使用这样的东西:

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);
}

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

匿名用户

为了扩展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();

}

匿名用户

就我们在留档中看到的,这可以通过实现org.springframework.data. reposity.Reposity来实现。