自定义Repository从Spring Data JPA访问EntityManager
Spring Data JPA 允许您通过使用存储库接口快速开发数据访问层。有时,您需要从Spring Data JPA访问EntityManager。这篇文章向您展示了如何访问实体管理器。
实体管理器
实体管理器的目的是与持久性上下文进行交互。然后,持久性上下文将管理实体实例及其关联的生命周期。这在我关于JPA 实体生命周期的博客文章中有所介绍
Spring Data JPA通过其存储库接口将您从EntityManager中抽象出来方面做得非常出色 –
- Repository
- CrudRepository
- JPARepository
但有时您需要访问实体管理器。
EntityManager.refresh
这方面的一个例子是刷新方法。刷新方法从数据库中刷新实例的状态,并覆盖实体管理器保存的副本。这可确保实体管理器管理器具有最新版本的数据
春季数据 JPA 示例
让我们使用我正常测试场中的 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 数据配置中被覆盖。
接下来,我们提供此接口的实现,并注入 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 实现的实体管理器。此方法的缺点是需要为每个 JPA 实现重复此任务。下一篇文章将探讨一种更通用的自定义存储库实现方法,允许其他 JPA 对象受益。