JPA EntityManager是一个接口,它提供了对Java Persistence API(JPA)的访问。它是一个用于管理持久性对象的重要工具,可以用来执行CRUD操作(创建、读取、更新和删除)。
EntityManager是一个重要的组件,它负责管理实体对象之间的关系。它还可以用来执行JPQL查询(Java Persistence Query Language)并将结果映射到实体对象上。
EntityManager还可以用来处理事务。当使用EntityManager时,必须在开始事务之前启动它。然后在事务中执行CRUD操作或JPQL查询。最后,必须在事务结束时提交或回滚事务。
// 创建 EntityManagerFactory EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit"); // 创建 EntityManager EntityManager em = emf.createEntityManager(); // 启动事务 em.getTransaction().begin(); // 执行 CRUD 操作或 JPQL 查询 ... // 提交或回滚事务 em.getTransaction().commit(); // 关闭 EntityManager em.close();
实体管理器概述
实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。
在此之前我们要先了解实体的状态及其转换,见下图
JPA 实体生命周期有四种状态
所有实体管理器都来自类型javax.persistence.EntityManagerFactory
的工厂。
以下示例演示为名为“EmployeeService”的持久性单元创建一个EntityManagerFactory
:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService");
以下示例演示如何在上一个示例中获取的工厂创建实体管理器:
EntityManager em = emf.createEntityManager();
我们使用实体管理器来持久化Employee
的实例。
Employee emp = new Employee(158); em.persist(emp);
以下代码显示如何在创建新员工并将其保留到数据库的方法中使用EntityManager
。
public Employee createEmployee(int id, String name, long salary) { Employee emp = new Employee(id); emp.setName(name); emp.setSalary(salary); em.persist(emp); return emp; }
一旦实体在数据库中,下一行代码显示如何找到它。
Employee emp = em.find(Employee.class, 1);
要从数据库中删除实体,请从EntityManager
调用remove
方法。
Employee emp = em.find(Employee.class, 1); em.remove(emp);
要更新实体,我们可以在被管实体上调用setter
方法。被管实体是从EntityManager
返回的实体。
Employee emp = em.find(Employee.class, 1); emp.setName("new Name");
以下代码显示如何启动和提交事务。
em.getTransaction().begin(); Employee emp = new Employee(158); em.persist(emp); em.getTransaction().commit();
在JPA
中,有一种称为Java
持久性查询语言(JP QL)的新的查询语言。
以下示例显示如何创建动态查询,然后执行它以获取数据库中的所有员工。
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", Employee.class); List<Employee> emps = query.getResultList();
我们通过在EntityManager
上发出createQuery()
调用并传入 JP QL 字符串来创建一个TypedQuery<Employee>
对象。
JP QL 字符串不是指EMPLOYEE
数据库表,而是Employee实体。
以下代码显示了一个简单的完全功能类,可用于对Employee
实体发出典型的创建,读取,更新和删除(CRUD)操作。
import java.util.List; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; public class EmployeeService { protected EntityManager em; public EmployeeService(EntityManager em) { this.em = em; } public Employee createEmployee(int id, String name, long salary) { Employee emp = new Employee(id); emp.setName(name); emp.setSalary(salary); em.persist(emp); return emp; } public void removeEmployee(int id) { Employee emp = findEmployee(id); if (emp != null) { em.remove(emp); } } public Employee raiseEmployeeSalary(int id, long raise) { Employee emp = em.find(Employee.class, id); if (emp != null) { emp.setSalary(emp.getSalary() + raise); } return emp; } public Employee findEmployee(int id) { return em.find(Employee.class, id); } public List<Employee> findAllEmployees() { TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", Employee.class); return query.getResultList(); } }
主类
import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence .createEntityManagerFactory("EmployeeService"); EntityManager em = emf.createEntityManager(); EmployeeService service = new EmployeeService(em); em.getTransaction().begin(); Employee emp = service.createEmployee(1, "Tom", 5000); em.getTransaction().commit(); System.out.println("Persisted " + emp); emp = service.findEmployee(1); System.out.println("Found " + emp); List<Employee> emps = service.findAllEmployees(); for (Employee e : emps) System.out.println("Found employee: " + e); em.getTransaction().begin(); emp = service.raiseEmployeeSalary(1, 1000); em.getTransaction().commit(); System.out.println("Updated " + emp); em.getTransaction().begin(); service.removeEmployee(158); em.getTransaction().commit(); System.out.println("Removed Employee 158"); em.close(); emf.close(); } }
描述持久性单元的配置在名为 persistence.xml 的XML文件中定义。
每个持久性单元都被命名。单个 persistence.xml 文件可以包含一个或多个命名的持久性单元配置。
以下代码显示了 persistence.xml 文件的演示
<persistence> <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> <properties> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/> <property name="javax.persistence.jdbc.user" value="APP"/> <property name="javax.persistence.jdbc.password" value="APP"/> </properties> </persistence-unit> </persistence>
persistence.xml 文件应放在 META-INF 目录中。
Java教程 -Java字符在Java中,char存储字符。Java使用Unicode来表示字符。Unicode可以表示在所有人类语言中找到的所有字符。Java...
Java线程教程 -Java线程中断我们可以通过使用interrupt()方法中断一个活动的线程。这个方法调用在线程只是一个指示。它是由线程...
Java数据类型教程 -Java float数据类型浮点数据类型当评估需要分数精度的表达式时,使用浮点数(也称为实数)。包含小数部分的数...
Java教程 -Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statem...
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程...