В моем предыдущем посте Доступ к 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; @NoRepositoryBean public 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, являются их собственными. |