В моем предыдущем посте Доступ к EntityManager из Spring Data JPA я показал, как расширить один репозиторий Spring Data JPA для доступа к методу EntityManager.refresh . Этот пост демонстрирует, как добавить EntityManager.refresh во все репозитории данных Spring.
Исходный код
Первый шаг — определить ваш интерфейс.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
package com.glenware.springboot.repository; import org.springframework.data.repository.NoRepositoryBean;import org.springframework.data.repository.Repository;import org.springframework.data.repository.CrudRepository; import java.io.Serializable;import java.util.Optional; @NoRepositoryBeanpublic interface CustomRepository<T, ID extends Serializable>extends CrudRepository<T, ID> { void refresh(T t);} |
Ключевые моменты —
- @NoRepositoryBean — это предотвращает создание экземпляра репозитория
- Расширение CrudRepository — вам нужно решить, какой репозиторий расширить. Я использую CrudRepository, как это было использовано в предыдущем посте
- подпись метода void refresh такая же, как метод EntityManager.refresh
Реализация
Следующим шагом является реализация этого интерфейса в пользовательском репозитории —
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.glenware.springboot.repository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository;import org.springframework.transaction.annotation.Transactional;import org.springframework.data.jpa.repository.support.JpaEntityInformation; import javax.persistence.EntityManager;import java.io.Serializable; public class CustomRepositoryImpl<T, ID extends Serializable>extends SimpleJpaRepository>T, ID> implements CustomRepository<T, ID> { private final EntityManager entityManager; public CustomRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); this.entityManager = entityManager; } @Override @Transactional public void refresh(T t) { entityManager.refresh(t); }} |
Ключевые моменты —
- Расширьте репозиторий SimpleJpaRepository . SimpleJpaRepository является реализацией по умолчанию для CrudRepository
- Конструктор — это конструктор SimpleJpaRepository, принимающий объекты JpaEntityInformation и EntityManager.
- Мы сохраняем локальную копию EntityManager
- метод refresh просто вызывает метод EntityManager.refresh.
Последний шаг — сообщить Spring Data, что его базовый класс — CustomRepositoryImpl —
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.glenware.springboot; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import com.glenware.springboot.repository.CustomRepositoryImpl; @SpringBootApplication@EnableJpaRepositories(repositoryBaseClass = CustomRepositoryImpl.class)public class ParkrunpbApplication { public static void main(String[] args) { SpringApplication.run(ParkrunpbApplication.class, args); }} |
Ключевые моменты —
- EnableJpaRepositories -Эта аннотация включает репозитории JPA и по умолчанию сканирует com.glenware.springboot
- Атрибут repositoryBaseClass используется, чтобы сообщить конфигурации Spring Data, что мы переопределяем базовый класс по умолчанию.
Все вместе сейчас
Затем мы можем использовать этот репозиторий в наших классах, поэтому мы изменили наш репозиторий из предыдущего поста из CrudRepository для расширения CustomRepository —
|
1
2
3
4
5
6
7
|
package com.glenware.springboot.repository; import com.glenware.springboot.form.ParkrunCourse; public interface ParkrunCourseRepository extends CustomRepository<ParkrunCourse, Long> {} |
Теперь мы можем получить доступ к методу EntityManager.refresh, используя —
|
1
|
parkrunCourseRepository.refresh( parkrunCourse ); |
Приведенный выше код был протестирован с помощью Spring Boot (1.5.6-Release), который использовал Spring Data JPA 1.11.6. Я могу добавить код в github, если требуется
Гоча
Одна область, которую вы должны проверить, это какая версия Spring Data JPA вы используете для расширения репозиториев. Мне пришлось адаптировать этот подход для старых репозиториев, хотя в настоящее время используется Spring Data JPA 1.11.6 Release
| Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . См. Оригинальную статью здесь: добавьте EntityManager.refresh во все репозитории данных Spring.
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |