Spring Data JPA 允许您通过使用 Repository 接口快速开发数据访问层。有时您需要从 Spring Data JPA 访问 EntityManager。这篇文章向您展示了如何访问 EntityManager。
EntityManager 的目的是与持久性上下文交互。持久性上下文将管理实体实例及其关联的生命周期。这在我关于 JPA 实体生命周期 的博文中有所介绍
Spring Data JPA 通过其 Repository 接口出色地将您从 EntityManager 中抽象出来 –
但偶尔您需要访问 EntityManager。
这方面的一个例子是刷新方法。 refresh 方法从数据库中刷新实例的状态,并覆盖 EntityManager 持有的副本。这确保 EntityManager 管理器拥有最新版本的数据
让我们使用来自我的普通 test ground 的 JPA 对象 –
@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; }
及其相关的存储库 -
public interface ParkrunCourseRepository extends CrudRepository {}
这是 Spring 存储库的标准实现,其中 CrudRepository 采用 ParkrunCourse,其键类型为 Long
创建自定义接口和实现
第一步是定义一个新接口,其签名与我们要访问的底层 EntityManager 方法具有相同的签名——
public interface ParkrunCourseRepositoryCustom { void refresh(ParkrunCourse parkrunCourse); }
关键是自定义实现必须以“Custom”结尾,除非在 Spring Data 配置中被覆盖。
接下来我们提供这个接口的实现,并注入 EntityManager –
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 接口更改为 -
public interface ParkrunCourseRepository extends CrudRepository, ParkrunCourseRepositoryCustom { }
然后我们可以刷新我们的 JPA 对象 –
@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);
此方法展示了如何使用 Spring Data JPA 访问 EntityManager。这种方法的优点是您可以访问特定 JPA 实现的 EntityManager。这种方法的缺点是您需要为每个 JPA 实现重复此任务。下一篇文章将介绍一种更通用的自定义存储库实现方法,让其他 JPA 对象受益。
标签2: Java教程地址:https://www.cundage.com/article/jcg-access-entitymanager-spring-data-jpa.html