Spring Jpa agrega funcionalidad personalizada a todos los repositorios y al mismo tiempo otras funciones personalizadas a un solo repositorio
Documentación de primavera aquíhttp://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations da un ejemplo para agregar funcionalidades personalizadas a todos los repositorios o a un solo repositorio, no a ambos.
Supongamos que quiero agregar algunas funciones personalizadas a todos los repositorios (usando Custom Repository Factory Bean) y algunas otras solo a un solo repositorio (docs dice que debe usar una interfaz personalizada y una aplicación personalizada); ¿Cómo puedo conseguir esto?
Algún código de ejemplo donde agregué el método "setCurrentTenansInSession" a todos los repositorios; ahora quiero agregar un método personalizado, por ejemplo, "newCustomMethod", en un solo repositorio (es un MyJpaRepository, como para mi fábrica de repositorios personalizados). ¿Cómo hago esto?
Interfaz de comportamiento personalizado:
@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object);
}
Implementación de comportamiento personalizado:
public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
public void setCurrentTenantInSession(Object object) {
//custom impl
}
}
Repositorio personalizado de bean de fábrica:
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);
}
}
Y finalmente la fábrica de repositorios personalizados:
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;
}
}