从 Spring Data JPA 访问 EntityManager

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(225)   2024-01-18 16:34:57

Spring Data JPA 允许您通过使用 Repository 接口快速开发数据访问层。有时您需要从 Spring Data JPA 访问 EntityManager。这篇文章向您展示了如何访问 EntityManager。

实体管理器

EntityManager 的目的是与持久性上下文交互。持久性上下文将管理实体实例及其关联的生命周期。这在我关于 JPA 实体生命周期 的博文中有所介绍

Spring Data JPA 通过其 Repository 接口出色地将您从 EntityManager 中抽象出来 –

  • 存储库
  • CrudRepository
  • JPARepository

但偶尔您需要访问 EntityManager。

实体管理器.refresh

这方面的一个例子是刷新方法。 refresh 方法从数据库中刷新实例的状态,并覆盖 EntityManager 持有的副本。这确保 EntityManager 管理器拥有最新版本的数据

Spring Data JPA 示例

让我们使用来自我的普通 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

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...