JPA - Entity Managers

本章将向您介绍JPA的简单示例.让我们以员工管理为例.这意味着员工管理层正在创建,更新,查找和删除员工.如上所述,我们使用MySQL数据库进行数据库操作.

此示例的主要模块如下:

  • 模型或POJO

    Employee.java

  • 持久性

    Persistence.xml

  • 服务

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

让我们使用Eclipselink获取我们在JPA安装中使用的包层次结构.按照以下示例的层次结构进行操作:

创建实体

实体只是bean或Models,在本例中我们将使用 Employee 作为实体. eid,ename,salary, deg 是此实体的属性.它包含这些属性的默认构造函数,setter和getter方法.

在上面显示的层次结构中,创建一个名为'com.it1352.eclipselink.entity'的包,在'src'(源)包下.在给定的包下创建一个名为 Employee.java 的类,如下所示:

package com.it1352.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.IT屋.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> tag是使用JPA持久性的特定名称定义的. < class> tag定义具有包名称的实体类. < properties> tag定义所有属性,< property> tag定义每个属性,例如数据库注册,URL规范,用户名和密码.这些是Eclipselink属性.此文件将配置数据库.

持久性操作

持久性操作用于数据库,它们加载存储操作.在业务组件中,所有持久性操作都属于服务类.

在上面显示的包层次结构中,创建一个名为'com.it1352.eclipselink.service'的包,在'src'(源)包下.所有服务类都命名为CreateEmloyee.java,UpdateEmployee.java,FindEmployee.java和DeleteEmployee.java.在给定的包下面如下:

创建员工

创建一个名为 CreateEmployee.java 的Employee类,如下所示:

 
 package com.it1352.eclipselink.service; 
 import javax.persistence.EntityManager; 
 import javax.persistence.EntityManagerFactory; 
 import javax.persistence.Persistence; 
 import com.it1352.eclipselink.entity.Employee; 
公共类CreateEmployee {
 public static void main(String [] args){
 EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("Eclipselink_JPA") ; 
 EntityManager entitymanager = emfactory.createEntityManager(); 
 entitymanager.getTransaction().bind(); 
员工员工=新员工(); 
 employee.setEid(1201); 
 employee.setEname("Gopal"); 
 employee.setSalary(40000); 
 employee.setDeg("技术经理"); 
 entitymanager.persist(employee); 
 entitymanager.getTransaction().commit(); 
 entitymanager.close(); 
 emfactory.close(); 
} 
}

在上面的代码中, createEntityManagerFactory()通过提供以下内容创建一个持久性单元我们在persistent.xml文件中为持久性单元提供的相同唯一名称. entitymanagerfactory对象将使用 createEntityManager()方法创建实体管理器实例. entitymanager对象为事务管理创建entitytransaction实例.通过使用entitymanager对象,我们可以将实体持久化到数据库中.

在编译和执行上述程序之后,您将从eclipse IDE的控制台面板上的eclipselink库获得通知.

结果,打开MySQL工作台并输入以下查询.

 
使用jpadb 
 select * from employee

名为 employee 的受影响数据库表格将以表格格式显示如下:

EidEname薪水Deg
1201Gopal40000技术经理

更新员工

要更新员工,我们需要获取记录表单数据库,进行更改并最终提交.名为 UpdateEmployee.java 的类如下所示:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.IT屋.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( );
   }
}

编译并执行上述程序后,您将在eclipse IDE的控制台面板上收到Eclipselink库的通知.

结果,打开MySQL工作台并输入以下查询.

use jpadb
select * from employee

受影响的数据库表 employee 将以表格格式显示如下:

EidEname薪水Deg
1201Gopal46000技术经理

员工的工资,1201更新为46000.

查找员工

查找员工我们将获得从数据库记录并显示它.在此操作中,EntityTransaction不涉及在检索记录时未应用任何事务.

名为 FindEmployee.java 的类如下所示.

package com.it1352.eclipselink.service; 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.IT屋.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.it1352.eclipselink.service; 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.IT屋.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 的受影响数据库将具有空记录.

在此示例中完成所有模块之后,包和文件层次结构如下所示:

模块