wake-up-neo.com

Erstellen eines schreibgeschützten Repository mit Spring Data

Ist es möglich, mit Spring Data schreibgeschützte Repositorys zu erstellen?

Ich habe einige Entitäten, die mit Ansichten verknüpft sind, und einige untergeordnete Entitäten, für die ich ein Repository mit einigen Methoden wie findAll(), findOne() und einigen Methoden mit der @Queryannotation bereitstellen möchte. Ich möchte vermeiden, Methoden wie save(…) und delete(…) zur Verfügung zu stellen, da sie keinen Sinn machen und Fehler verursachen könnten.

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
}

Vielen Dank!

21
jpboudreault

Ja, Sie können ein handgefertigtes Basis-Repository hinzufügen. Sie verwenden normalerweise so etwas:

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

  T findOne(ID id);

  Iterable<T> findAll();
}

Sie können sich jetzt konkrete Repos erweitern lassen, die soeben definiert wurden:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> {

  T findByEmailAddress(String emailAddress);
}

Der entscheidende Teil, der das Basisrepo definiert, besteht darin, dass die Methodendeklarationen die sehr gleiche Signatur wie die in CrudRepository deklarierten Methoden tragen. Wenn dies der Fall ist, können wir die Aufrufe immer noch in die Implementierungs-Bean weiterleiten, die den Repository-Proxy unterstützt. Ich habe im SpringSource-Blog ein ausführlicheres Blogpost zu diesem Thema geschrieben.

44
Oliver Drotbohm

Um die Antwort von Oliver Gierke zu erweitern, benötigen Sie in den neueren Versionen von Spring Data die Annotation @NoRepositoryBean in Ihrem ReadOnlyRepository (übergeordnete Schnittstelle), um Fehler beim Starten der Anwendung zu vermeiden:

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

}
20
Tristan Perry

Soweit wir in der Dokumentation sehen können, ist dies durch die Implementierung von org.springframework.data.repository.Repository möglich.

6

Für mich hat das folgende funktioniert. Bei der Verwendung von Olivers Lösung bekam ich beim Starten einen Fehler Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type.

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