Spring Jpa dodaje niestandardową funkcjonalność do wszystkich repozytoriów, a jednocześnie inne niestandardowe funkcje do jednego repozytorium
Dokumentacja wiosenna tutajhttp://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations daje przykład dodawania niestandardowych funkcji do wszystkich repozytoriów lub pojedynczych repozytoriów, a nie obu.
Przypuśćmy, że chcę dodać kilka niestandardowych funków do wszystkich repozytoriów (używając Custom Repository Factory Bean), a inne tylko do pojedynczych repozytoriów (docs mówi, aby użyć Custom Interface i Custom Impl); jak mogę to osiągnąć?
Przykładowy kod, w którym dodałem metodę „setCurrentTenansInSession” do wszystkich repozytoriów; teraz chcę dodać metodę niestandardową, np. „newCustomMethod”, na jednym repozytorium (to jest MyJpaRepository, tak jak w mojej fabryce repozytoriów niestandardowych). Jak mam to zrobic?
Interfejs zachowania niestandardowego:
@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object);
}
Implementacja niestandardowych zachowań:
public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object) {
//custom impl
}
}
Custom bean repozytorium fabrycznego:
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);
}
}
I wreszcie fabryka niestandardowych repozytoriów:
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;
}
}