Репозиторий переопределения, предоставляемый JpaRepositoryFactoryBean - PullRequest
0 голосов
/ 10 июля 2020

У меня есть BaseRepository:

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    
    List<T> findByField(String fieldName, Object fieldValue);

    int softDelete(T entity, LocalDateTime timestamp);

}

У меня есть его реализация:

public class BaseRepositoryImpl<T, ID extends Serializable> implements BaseRepository<T, ID> {

        List<T> findByField(String fieldName, Object fieldValue) {
               //code here
        }

        public int softDelete(T entity, LocalDateTime timestamp) {
               //code here
        }
}

Затем у меня есть BaseRepositoryFactoryBean:

public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I>{

    public BaseRepositoryFactoryBean(Class<? extends R> repositoryInterface) {
        super(repositoryInterface);
    }

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

    //INNER CLASS
    private static class SimpleJpaExecutorFactory<T, I extends Serializable> extends JpaRepositoryFactory {
        
        public SimpleJpaExecutorFactory(EntityManager entityManager) {
            super(entityManager);
        }

        @Override
        protected JpaRepositoryImplementation<?, ?> getTargetRepository(RepositoryInformation information, EntityManager entityManager) {
            //HERE RETURN BaseRepositoryImpl
            return new BaseRepositoryImpl<>((Class<T>) information.getDomainType(), entityManager);
        }

        @Override
        protected Class getRepositoryBaseClass(RepositoryMetadata metadata) {
            //HERE RETURN BaseRepositoryImpl
            return BaseRepositoryImpl.class;
        }
    }
}

Наконец, У меня есть EmployeeRepository:

@Repository
public interface EmployeeRepository extends BaseRepository<Employee, Long> {

    //IMPORTANT POINT HERE, I WANT TO OVERRIDE THIS METHOD
    @Override
    default int softDelete(Employee entity, LocalDateTime localDateTime) {
        System.out.println("55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555");
        entity.setStatus(Status.DELETED);
        entity.setUpdatedAt(localDateTime);
        entity.getAccount().setStatus(Status.DELETED);
        entity.getAccount().setUpdatedAt(localDateTime);
        save(entity);

        return 1;
    }

}

Использование времени (в моем сервисе):

public class Service {

    @Autowired
    private EmployeeRepository employeeRepository;

    public int test(Employee entity) {
        return employeeRepository.softDelete(entity, LocalDateTime.now());
    }
}

Я ожидал, что будет выполнен метод softDelete из EmployeeRepository. Но похоже, что метод из BaseRepositoryImpl был выполнен. Я хочу просто переопределить softDelete, но оставить findByField из BaseRepositoryImpl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...