是否可以使用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
}
谢谢!
是的,要做的就是添加一个手工制作的基础存储库。您通常使用这样的东西:
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来实现。