2012-06-19 13 views
19

¿Es posible crear repositorios de solo lectura utilizando Spring Data?Creación de un repositorio de solo lectura con SpringData

que tienen algunas entidades vinculadas a puntos de vista y algunas entidades secundarias para los que me gustaría proporcionar un repositorio con algunos métodos como findAll(), findOne() y algunos métodos con el @Query anotación. Me gustaría evitar proporcionar métodos como save(…) y delete(…) ya que no tienen sentido y podrían crear errores.

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 
} 

¡Gracias!

Respuesta

36

Sí, el camino a seguir es agregar un depósito base hecho a mano. Por lo general, usar algo como esto:

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

    T findOne(ID id); 

    Iterable<T> findAll(); 
} 

Ahora puede tener que repos concretas extender esa acaba de definir una:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> { 

    T findByEmailAddress(String emailAddress); 
} 

La parte crucial definir el repositorio de base es que las declaraciones de métodos llevar el muy la misma firma como los métodos declarados en CrudRepository si ese es el caso, aún podemos enrutar las llamadas al bean de implementación que respalda el proxy del repositorio. He escrito un blog post más detallado sobre ese tema en el blog de SpringSource.

+0

Hay una cosa difícil. Si estoy usando una base de datos en memoria como HSQL para las pruebas de integración, puedo usar el método de guardar de la vista para crear datos de prueba en lugar de crear una relación entre sus objetos y poblarlos. Entonces, en este caso necesitaré el método save de la vista solo para probar pero no para el código de producción. ¿Hay alguna manera de lograrlo? – DBS

14

Para ampliar la respuesta de Oliver Gierke, en las versiones más recientes de los datos de Primavera que tendrá la anotación @NoRepositoryBean para impedir la aplicación de puesta en marcha errores:

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

} 
Cuestiones relacionadas