Можно ли настроить Jpa Repository с наследованием? - PullRequest
0 голосов
/ 13 апреля 2019

Допустим, у меня есть два класса: Subject и Client, Subject является базовым классом.

@Entity
public class Client extends Subject

Теперь я хочу добавить настроенный базовый интерфейс Jpa, чтобы методы были доступны в подинтерфейсах:

@NoRepositoryBean
public interface SubjectRepository <T extends Subject> extends 
JpaRepository<T, Long>, CustomSubjectRepository<T> {}

CustomSubjectRepository выглядит так:

public interface CustomSubjectRepository<T extends Subject> {
    void saveEncrypted(T subject);
}

Мне нужна реализация, поэтому я объявляю класс:

@Repository
@Transactional
public class CustomSubjectRepositoryImpl<T extends Subject> implements 
CustomSubjectRepository<T> {

@PersistenceContext
private EntityManager entityManager;

@Override
public void saveEncrypted(T subject) {
    //implementation
}
}

Затем хотел создать ClientRepository и наследовать от SubjectRepository , чтобы иметь доступ к saveEncrypted .

@Repository
public interface ClientRepository extends SubjectRepository<Client> {
}

Но когда дело доходит до компиляции, я получаю:

Ошибка создания компонента с именем clientRepository: сбой вызова метода init;Вложенным исключением является java.lang.IllegalArgumentException: не удалось создать запрос для метода public abstract void com.path.repositories.CustomSubjectRepository.saveEncrypted (com.path.models.Subject)!Не найдено свойство saveEncrypted для типа Клиент!

1 Ответ

0 голосов
/ 13 апреля 2019

Вы расширяете интерфейс, поэтому Spring будет пытаться создать запрос с именем saveEncrypted вместо использования настраиваемого метода.

Я считаю, что лучшим решением является расширение класса CustomSubjectRepositoryImpl.

@Repository
public class ClientRepository extends CustomSubjectRepositoryImpl<Client> {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...