Статьи

Доступ к EntityManager из Spring Data JPA

Spring Data JPA позволяет быстро разрабатывать уровень доступа к данным с помощью интерфейсов репозитория. Иногда вам потребуется доступ к EntityManager из Spring Data JPA. В этом посте показано, как получить доступ к EntityManager.

EntityManager

Цель EntityManager — взаимодействовать с постоянным контекстом. Затем контекст постоянства будет управлять экземплярами сущностей и их связанным жизненным циклом. Это было описано в моем блоге на жизненном цикле сущности JPA

Spring Data JPA отлично справляется с абстракцией от EntityManager через интерфейсы репозитория.

Но иногда вам нужно получить доступ к EntityManager.

EntityManager.refresh

Примером этого является метод обновления. Метод refresh обновляет состояние экземпляра из базы данных и перезаписывает копию, хранящуюся в EntityManager. Это гарантирует, что менеджер EntityManager имеет самую последнюю версию данных

Spring Data JPA Пример

Давайте использовать объект JPA из моего обычного испытательного полигона

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Entity
@Table(name = "PARKRUNCOURSE")
public class ParkrunCourse {
   @Id
   @Column(name = "PRCOURSE_ID")
   @GeneratedValue
   private Long courseId;
   @Column(name = "COURSENAME")
   private String courseName;
   @Column(name = "URL")
   private String url;
   @Column(name = "AVERAGETIME")
   private Long averageTime;
}

И связанный с ним репозиторий —

1
public interface ParkrunCourseRepository extends CrudRepository {}

Это стандартная реализация репозитория Spring, с CrudRepository, принимающим ParkrunCourse, и его тип ключа Long

Создание пользовательских интерфейсов и имплементация

Первый шаг — определить новый интерфейс с той же сигнатурой, что и базовый метод EntityManager, к которому мы хотим получить доступ.

1
2
3
public interface ParkrunCourseRepositoryCustom {
   void refresh(ParkrunCourse parkrunCourse);
}

Ключевым моментом является то, что пользовательская реализация должна заканчиваться на «Custom», если она не переопределена в конфигурации Spring Data.

Далее мы предоставляем реализацию для этого интерфейса и внедряем EntityManager —

01
02
03
04
05
06
07
08
09
10
11
12
13
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import com.glenware.springboot.form.ParkrunCourse;
import org.springframework.transaction.annotation.Transactional;
public class ParkrunCourseRepositoryImpl implements ParkrunCourseRepositoryCustom {
   @PersistenceContext
   private EntityManager em;
   @Override
   @Transactional
   public void refresh(ParkrunCourse parkrunCourse) {
      em.refresh(parkrunCourse);
   }
}

Мы должны закончить имя нашей реализации с «Impl»

Затем мы изменяем интерфейс ParkrunCourseRepository на —

1
2
public interface ParkrunCourseRepository extends CrudRepository, ParkrunCourseRepositoryCustom {
}

Затем мы можем обновить наш объект JPA —

1
2
3
4
5
6
@Autowired
private ParkrunCourseRepository parkrunCourseRepository;
ParkrunCourse parkrunCourse = parkrunCourseRepository.findOne(1L);
// Do some work & in the mean time the database has been updated by a batch job
// refresh object and now up to date
parkrunCourseRepository.refresh(parkrunCourse);

Выводы

Этот подход показывает, как получить доступ к EntityManager с помощью Spring Data JPA. Преимущество этого подхода в том, что вы можете получить доступ к EntityManager для конкретной реализации JPA. Недостатком этого подхода является то, что вам нужно будет повторять эту задачу для каждой реализации JPA. В следующей публикации рассматривается более общий подход к реализации пользовательского репозитория, позволяющий использовать другие объекты JPA.

Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Доступ к EntityManager из Spring Data JPA

Мнения, высказанные участниками Java Code Geeks, являются их собственными.