Статьи

Добавьте EntityManager.refresh во все репозитории данных Spring

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