Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a read-only repository with SpringData

Is it possible to create read-only repositories using Spring Data?

I have some entities linked to views and some child entities for which I would like to provide a repository with some methods like findAll(), findOne() and some methods with the @Queryannotation. I would like to avoid providing methods like save(…) and delete(…) since they make no sense and could create errors.

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 } 

Thanks!

like image 297
jpboudreault Avatar asked Jun 19 '12 18:06

jpboudreault


People also ask

What is read-only transaction Spring?

In a Spring application, the web @Controller calls a @Service method, which is annotated using the @Transactional annotation. By default, Spring transactions are read-write, but you can explicitly configure them to be executed in a read-only context via the read-only attribute of the @Transactional annotation.


2 Answers

Yes, the way to go is to add a handcrafted base repository. You usually use something like this:

public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {    T findOne(ID id);    Iterable<T> findAll(); } 

You can now have you concrete repos extend that just defined one:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> {    T findByEmailAddress(String emailAddress); } 

The crucial part defining the base repo is that the method declarations carry the very same signature as the methods declared in CrudRepository if that's the case we can still route the calls into the implementation bean backing the repository proxy. I've written a more detailed blog post about that topic in the SpringSource blog.

like image 132
Oliver Drotbohm Avatar answered Sep 20 '22 23:09

Oliver Drotbohm


To expand on Oliver Gierke's answer, in the more recent versions of Spring Data you will need the @NoRepositoryBean annotation on your ReadOnlyRepository (parent interface) to prevent application start up errors:

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();  } 
like image 33
Tristan Perry Avatar answered Sep 21 '22 23:09

Tristan Perry