У меня есть 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