2012-06-19 16 views
19

È possibile creare repository di sola lettura utilizzando Spring Data?Creazione di un repository di sola lettura con SpringData

devo alcune entità legate alla vista e alcune entità del bambino per il quale vorrei fornire un repository con alcuni metodi come findAll(), findOne() e alcuni metodi con lo @Query annotazione. Vorrei evitare di fornire metodi come save(…) e delete(…) poiché non hanno senso e potrebbero creare errori.

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 
} 

Grazie!

risposta

36

Sì, la strada da percorrere è aggiungere un repository di base artigianale. Di solito usare qualcosa di simile:

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

    T findOne(ID id); 

    Iterable<T> findAll(); 
} 

ora è possibile avere voi pronti contro termine concreti estendere quella appena definito uno:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> { 

    T findByEmailAddress(String emailAddress); 
} 

La parte cruciale che definisce la repo di base è che le dichiarazioni di metodo portare il molto stessa firma come i metodi dichiarati in CrudRepository se questo è il caso possiamo ancora instradare le chiamate nel bean di implementazione eseguendo il backup del proxy repository. Ho scritto uno blog post più dettagliato su quell'argomento nel blog SpringSource.

+0

C'è una cosa complicata. Se sto usando un database in-memory come HSQL per il test di integrazione, posso usare il metodo di salvataggio della vista per creare dati di test invece di creare una relazione tra i suoi oggetti e popolarli. Quindi in questo caso avrò bisogno del metodo di salvataggio della vista solo per il test ma non per il codice di produzione. C'è un modo per raggiungerlo? – DBS

14

Ad ampliare la risposta di Oliver Gierke, nelle versioni più recenti di dati Primavera è necessario l'annotazione @NoRepositoryBean per evitare applicazioni start up errori:

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

} 
Problemi correlati