La documentazione Spring qui http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations fornisce esempi per aggiungere funzionalità personalizzate a tutti i repository oa un singolo repository, non entrambi.Spring Jpa aggiunge funzionalità personalizzate a tutti i repository e allo stesso tempo altre funzioni personalizzate a un singolo repository
Supponiamo di voler aggiungere alcune funzioni personalizzate a tutti i repository (utilizzando Custom Repository Factory Bean) e altri solo a un singolo repository (i documenti dicono di utilizzare un'interfaccia personalizzata e una Impl personalizzata); Come posso raggiungere questo obiettivo?
Alcuni esempi di codice in cui ho aggiunto il metodo "setCurrentTenansInSession" a tutti i repository; ora voglio aggiungere un metodo personalizzato, ad es. "newCustomMethod", su un singolo repository (cioè un MyJpaRepository, come per il mio factory di repository personalizzato). Come faccio a fare questo?
personalizzato dell'interfaccia comportamento:
@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object);
}
implementazione comportamento personalizzato:
public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object) {
//custom impl
}
}
personalizzato repository fabbrica di fagioli:
public class MultiTenantJpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new MultiTenantJpaRepositoryFactory(entityManager);
}
}
E infine la fabbrica repository personalizzato:
public class MultiTenantJpaRepositoryFactory extends JpaRepositoryFactory {
public MultiTenantJpaRepositoryFactory(EntityManager entityManager) {
super(entityManager);
}
@Override
protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
final JpaEntityInformation<?, Serializable> entityInformation = getEntityInformation(metadata.getDomainType());
final SimpleJpaRepository<?, ?> repo = new MultiTenantSimpleJpaRepository(entityInformation, entityManager);
repo.setLockMetadataProvider(LockModeRepositoryPostProcessor.INSTANCE.getLockMetadataProvider());
return repo;
}
@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
return MultiTenantSimpleJpaRepository.class;
}
}
Grazie mille kkamenev! – lincetto
A partire da 'spring-data-commons' 1.11 specificare' base-class = "com.example.CommonCustomRepositoryImpl" 'invece di deprecato attributo' factory-class' per 'jpa: repositories'. La produzione non è necessaria quando si specifica la classe base. –