que entitymanagerfactory ejemplos ejemplo data java spring jpa spring-data spring-data-jpa

java - entitymanagerfactory - que es spring data



Creando un repositorio de solo lectura con SpringData (4)

¿Es posible crear repositorios de solo lectura utilizando Spring Data?

Tengo algunas entidades vinculadas a vistas y algunas entidades secundarias para las que me gustaría proporcionar un repositorio con algunos métodos como findAll() , findOne() y algunos métodos con la anotación @Query . 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!


Para ampliar la respuesta de Oliver Gierke, en las versiones más recientes de Spring Data necesitará la anotación @NoRepositoryBean en su ReadOnlyRepository (interfaz principal) para evitar errores de inicio de la aplicación:

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


Para mí lo siguiente funcionó. Usando la solución de Oliver, estaba obteniendo un error La Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type al iniciar.

@NoRepositoryBean public interface ReadOnlyRepository<T,ID> extends Repository<T, ID> { Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); }



Sí, el camino a seguir es agregar un repositorio base hecho a mano. Usualmente usas algo como esto:

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

Ahora puedes hacer que tus repositorios concretos se extiendan a uno solo definido:

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

La parte crucial que define el repositorio básico es que las declaraciones de los métodos llevan la misma firma que los métodos declarados en CrudRepository si ese es el caso, aún podemos enrutar las llamadas al bean de implementación que respalda al proxy del repositorio. He escrito una publicación de blog más detallada sobre ese tema en el blog de SpringSource.