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
|
@Autowiredprivate 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 dateparkrunCourseRepository.refresh(parkrunCourse); |
Выводы
Этот подход показывает, как получить доступ к EntityManager с помощью Spring Data JPA. Преимущество этого подхода в том, что вы можете получить доступ к EntityManager для конкретной реализации JPA. Недостатком этого подхода является то, что вам нужно будет повторять эту задачу для каждой реализации JPA. В следующей публикации рассматривается более общий подход к реализации пользовательского репозитория, позволяющий использовать другие объекты JPA.
| Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Доступ к EntityManager из Spring Data JPA
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |