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, являются их собственными. |