Spring Jpa добавляет пользовательские функции во все репозитории и одновременно другие пользовательские функции в одном репозитории.

Весенняя документация здесьhttp://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations приводит пример добавления пользовательских функций во все репозитории или в отдельные репозитории, но не в оба.

Предположим, я хочу добавить некоторые пользовательские функции во все репозитории (используя Custom Repository Factory Bean), а некоторые другие только в отдельные репозитории (docs говорит об использовании пользовательского интерфейса и пользовательского Impl); как я могу этого достичь?

Пример кода, где я добавил "setCurrentTenansInSession» метод для всех хранилищ; Теперь я хочу добавить собственный метод, например, "newCustomMethod»в один репозиторий (это MyJpaRepository, как для моей фабрики пользовательских репозиториев). Как мне это сделать?

Пользовательский интерфейс поведения:

@NoRepositoryBean
public interface MyJpaRepository extends JpaRepository { 
    public void setCurrentTenantInSession(Object object);       
}

Реализация пользовательского поведения:

public class MultiTenantSimpleJpaRepository extends SimpleJpaRepository implements MyJpaRepository {
    public void setCurrentTenantInSession(Object object) {
        //custom impl
    }
}

Пользовательский репозиторий фабричного компонента:

public class MultiTenantJpaRepositoryFactoryBean extends JpaRepositoryFactoryBean {

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        return new MultiTenantJpaRepositoryFactory(entityManager);
    }
}

И наконец фабрика нестандартных хранилищ:

public class MultiTenantJpaRepositoryFactory extends JpaRepositoryFactory {
    public MultiTenantJpaRepositoryFactory(EntityManager entityManager) {
        super(entityManager);
    }

    @Override
    protected JpaRepository getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
        final JpaEntityInformation 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;
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос