JPA - 实体管理器
本章将向您介绍 JPA 的简单示例。 让我们以员工管理为例。 表示员工管理正在创建、更新、查找、删除员工。 上面提到我们使用MySQL数据库进行数据库操作。
本例的主要模块如下:
Model 或 POJO
Employee.java
Persistence
Persistence.xml
Service
CreatingEmployee.java
UpdatingEmployee.java
FindingEmployee.java
DeletingEmployee.java
让我们采用在 Eclipselink 的 JPA 安装中使用的包层次结构。 请遵循本示例的层次结构,如下所示:
创建实体
实体只不过是bean或模型,在本例中我们将使用Employee作为实体。 eid、ename、salary 和 deg 是该实体的属性。 它包含这些属性的默认构造函数、setter 和 getter 方法。
在上面显示的层次结构中,在 "src"(源)包下创建一个名为 "com.tutorialspoint.eclipselink.entity" 的包。 在给定包下创建一个名为 Employee.java 的类,如下所示:
package com.tutorialspoint.eclipselink.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int eid; private String ename; private double salary; private String deg; public Employee(int eid, String ename, double salary, String deg) { super( ); this.eid = eid; this.ename = ename; this.salary = salary; this.deg = deg; } public Employee( ) { super(); } public int getEid( ) { return eid; } public void setEid(int eid) { this.eid = eid; } public String getEname( ) { return ename; } public void setEname(String ename) { this.ename = ename; } public double getSalary( ) { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getDeg( ) { return deg; } public void setDeg(String deg) { this.deg = deg; } @Override public String toString() { return "Employee [eid=" + eid + ", ename=" + ename + ", salary=" + salary + ", deg=" + deg + "]"; } }
在上面的代码中,我们使用@Entity注解将这个POJO类作为实体。
在进入下一个模块之前,我们需要为关系实体创建数据库,这将在 persistence.xml 文件中注册数据库。 打开 MySQL 工作台并键入查询,如下所示:
create database jpadb use jpadb
Persistence.xml
该模块在 JPA 概念中起着至关重要的作用。 在此 xml 文件中,我们将注册数据库并指定实体类。
在上面显示的包层次结构中,JPA Content 包下的 persistence.xml 如下:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL"> <class>com.tutorialspoint.eclipselink.entity.Employee</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="root"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
在上面的xml中,<persistence-unit> 标签定义了JPA持久化的特定名称。<class> 标签定义带有包名称的实体类。<properties> 标签定义了所有属性,<property> 标签定义了每个属性,例如数据库注册、URL 规范、用户名和密码。 这些是 Eclipselink 属性。 该文件将配置数据库。
持久化操作
持久化操作用于数据库,它们是load和store操作。 在业务组件中,所有持久性操作都属于服务类。
在上面显示的包层次结构中,在 "src"(源)包下创建一个名为 "com.tutorialspoint.eclipselink.service" 的包。 所有服务类名为CreateEmloyee.java、UpdateEmployee.java、FindEmployee.java 和DeleteEmployee.java。 属于给定包如下:
创建员工
创建一个名为 CreateEmployee.java 的 Employee 类,如下所示:
package com.tutorialspoint.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.tutorialspoint.eclipselink.entity.Employee; public class CreateEmployee { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager( ); entitymanager.getTransaction( ).begin( ); Employee employee = new Employee( ); employee.setEid( 1201 ); employee.setEname( "Gopal" ); employee.setSalary( 40000 ); employee.setDeg( "Technical Manager" ); entitymanager.persist( employee ); entitymanager.getTransaction( ).commit( ); entitymanager.close( ); emfactory.close( ); } }
在上面的代码中,createEntityManagerFactory () 通过提供与我们在 persistence.xml 文件中为持久性单元提供的相同的唯一名称来创建持久性单元。 entitymanagerfactory对象将使用createEntityManager()方法创建entitymanager实例。 entitymanager对象创建entitytransaction实例来进行事务管理。 通过使用entitymanager对象,我们可以将实体持久化到数据库中。
编译并执行上述程序后,您将在 eclipse IDE 的控制台面板上收到来自 eclipselink 库的通知。
要获得结果,请打开 MySQL 工作台并键入以下查询。
use jpadb select * from employee
受影响的名为employee的数据库表将以表格格式显示,如下所示:
Eid | Ename | Salary | Deg |
---|---|---|---|
1201 | Gopal | 40000 | Technical Manager |
更新员工
要更新员工,我们需要从数据库中获取记录,进行更改,最后提交。 名为UpdateEmployee.java的类如下所示:
package com.tutorialspoint.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.tutorialspoint.eclipselink.entity.Employee; public class UpdateEmployee { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager( ); entitymanager.getTransaction( ).begin( ); Employee employee = entitymanager.find( Employee.class, 1201 ); //before update System.out.println( employee ); employee.setSalary( 46000 ); entitymanager.getTransaction( ).commit( ); //after update System.out.println( employee ); entitymanager.close(); emfactory.close(); } }
编译并执行上述程序后,您将在 Eclipse IDE 的控制台面板上收到来自 Eclipselink 库的通知。
要获得结果,请打开 MySQL 工作台并键入以下查询。
use jpadb select * from employee
受影响的名为employee的数据库表将以表格格式显示,如下所示:
Eid | Ename | Salary | Deg |
---|---|---|---|
1201 | Gopal | 46000 | Technical Manager |
员工工资1201更新为46000。
查找员工
为了查找员工,我们将从数据库中获取记录并显示它。 在此操作中,不涉及 EntityTransaction,检索记录时不会应用任何事务。
名为FindEmployee.java的类如下。
package com.tutorialspoint.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.tutorialspoint.eclipselink.entity.Employee; public class FindEmployee { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); Employee employee = entitymanager.find( Employee.class, 1201 ); System.out.println("employee ID = " + employee.getEid( )); System.out.println("employee NAME = " + employee.getEname( )); System.out.println("employee SALARY = " + employee.getSalary( )); System.out.println("employee DESIGNATION = " + employee.getDeg( )); } }
编译并执行上述程序后,您将在 Eclipse IDE 的控制台面板上得到 Eclipselink 库的输出,如下所示:
employee ID = 1201 employee NAME = Gopal employee SALARY = 46000.0 employee DESIGNATION = Technical Manager
删除员工
要删除员工,首先我们要找到该记录,然后将其删除。 这里EntityTransaction扮演着重要的角色。
名为DeleteEmployee.java的类如下:
package com.tutorialspoint.eclipselink.service; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import com.tutorialspoint.eclipselink.entity.Employee; public class DeleteEmployee { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager( ); entitymanager.getTransaction( ).begin( ); Employee employee = entitymanager.find( Employee.class, 1201 ); entitymanager.remove( employee ); entitymanager.getTransaction( ).commit( ); entitymanager.close( ); emfactory.close( ); } }
编译并执行上述程序后,您将在 Eclipse IDE 的控制台面板上收到来自 Eclipselink 库的通知。
要获得结果,请打开 MySQL 工作台并键入以下查询。
use jpadb select * from employee
名为employee的受影响数据库将有空记录。
完成本例中的所有模块后,包和文件层次结构如下所示: