上一节:
下一节:

  JPA - 实体管理器

  • 简述

    本章将带您了解使用 JPA 的简单示例。让我们以员工管理为例。这意味着员工管理正在创建、更新、查找和删除员工。如上所述,我们使用 MySQL 数据库进行数据库操作。
    本示例的主要模块如下:
    • Model or POJO
      Employee.java
    • Persistence
      持久化文件
    • Service
      CreatingEmployee.java
      UpdatingEmployee.java
      FindingEmployee.java
      DeletingEmployee.java
    让我们以在 Eclipselink 的 JPA 安装中使用的包层次结构为例。遵循此示例的层次结构,如下所示:
    包层次结构
  • 创建实体

    实体只不过是 bean 或模型,在这个例子中我们将使用 Employee 作为实体。 eid, ename, salary,deg是该实体的属性。它包含这些属性的默认构造函数、setter 和 getter 方法。
    在上面显示的层次结构中,创建一个名为的包 ‘com.jc2182.eclipselink.entity’, 在下面 ‘src’(源)包。创建一个名为的类Employee.java 在给定的包如下:
    
    package com.jc2182.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
    

    持久化文件

    该模块在 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.jc2182.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 属性。该文件将配置数据库。
  • 持久化操作

    持久化操作用于数据库,它们是 loadstore操作。在业务组件中,所有持久性操作都属于服务类。
    在上面显示的包层次结构中,创建一个名为的包 ‘com.jc2182.eclipselink.service’, 在下面 ‘src’(来源)包。所有名为 CreateEmloyee.java、UpdateEmployee.java、FindEmployee.java 和 DeleteEmployee.java 的服务类。属于给定的包如下:
  • 创建员工

    创建一个名为 Employee 类 CreateEmployee.java 如下:
    
    package com.jc2182.eclipselink.service;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import com.jc2182.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 文件中为persistence-unit 提供的相同的唯一名称来创建一个持久化单元。entitymanagerfactory 对象将通过使用来创建 entitymanager 实例createEntityManager ()方法。entitymanager 对象为事务管理创建 entitytransaction 实例。通过使用 entitymanager 对象,我们可以将实体持久化到数据库中。
    编译并执行上述程序后,您将在 Eclipse IDE 的控制台面板上收到来自 eclipselink 库的通知。
    对于结果,打开 MySQL 工作台并键入以下查询。
    
    use jpadb
    select * from employee
    
    受影响的数据库表名为 employee 将以表格形式显示如下:
    开斋节 名称 薪水 德格
    1201 戈帕尔 40000 技术经理
  • 更新员工

    要更新员工,我们需要获取记录表单数据库,进行更改,最后提交。类名为UpdateEmployee.java 显示如下:
    
    package com.jc2182.eclipselink.service;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import com.jc2182.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 将以表格形式显示如下:
    开斋节 名称 薪水 德格
    1201 戈帕尔 46000 技术经理
    员工工资 1201 更新为 46000。
  • 寻找员工

    要查找员工,我们将从数据库中获取记录并显示它。在此操作中,不涉及 EntityTransaction 检索记录时不应用任何事务。
    类名为 FindEmployee.java 如下。
    
    package com.jc2182.eclipselink.service;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import com.jc2182.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.jc2182.eclipselink.service;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import com.jc2182.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 将有空记录。
    完成本示例中的所有模块后,包和文件层次结构如下所示:
    模块
上一节:
下一节: