Spring Data JPA允许您通过使用Repository接口来快速开发数据访问层。 有时,您需要从Spring Data JPA访问EntityManager。 这篇文章向您展示了如何访问EntityManager。
实体管理器
EntityManager的目的是与持久性上下文进行交互。 然后,持久性上下文将管理实体实例及其关联的生命周期。 我的有关JPA实体生命周期的博客文章对此进行了介绍。
Spring Data JPA出色地完成了工作,并通过其Repository接口将您从EntityManager中抽象出来–
- 资料库
- Crud存储库
- JPAR存储库
但是有时您需要访问EntityManager。
EntityManager.refresh
刷新方法就是一个例子。 refresh方法从数据库刷新实例的状态,并覆盖EntityManager持有的副本。 这可确保EntityManager管理器具有最新的数据版本
Spring Data JPA示例
让我们从正常的测试环境中使用JPA对象-
@Entity
@Table(name = "PARKRUNCOURSE")
public class ParkrunCourse {@Id@Column(name = "PRCOURSE_ID")@GeneratedValueprivate 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 {@PersistenceContextprivate EntityManager em;@Override@Transactionalpublic 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。 这种方法的优点是您可以访问EntityManager以获得特定的JPA实现。 这种方法的缺点是您需要为每个JPA实现重复执行此任务。 下一篇文章介绍了用于自定义存储库实现的更通用方法,使其他JPA对象受益。
翻译自: https://www.javacodegeeks.com/2017/10/access-entitymanager-spring-data-jpa.html