JPA - 實體管理器



本章將帶您瞭解 JPA 的簡單示例。讓我們以員工管理為例。這意味著員工管理是建立、更新、查詢和刪除員工。如上所述,我們使用 MySQL 資料庫進行資料庫操作。

此示例的主要模組如下所示

  • 模型或 POJO

    Employee.java

  • 持久化

    Persistence.xml

  • 服務

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

讓我們採用在使用 Eclipselink 進行 JPA 安裝時使用的包層次結構。請按照以下示例的層次結構

Package Hierarchy

建立實體

實體只不過是 Bean 或模型,在此示例中,我們將使用Employee作為實體。eid、ename、salarydeg是此實體的屬性。它包含這些屬性的預設建構函式、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 內容包下的 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://: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 屬性。此檔案將配置資料庫。

持久化操作

持久化操作用於針對資料庫,它們是載入儲存操作。在業務元件中,所有持久化操作都屬於服務類。

在上面顯示的包層次結構中,在‘src’(源)包下建立一個名為‘com.tutorialspoint.eclipselink.service’的包。所有服務類,例如 CreateEmloyee.java、UpdateEmployee.java、FindEmployee.java 和 DeleteEmployee.java,都屬於給定的包,如下所示

建立員工

建立一個名為CreateEmployee.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 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 ()透過提供與我們在 persistent.xml 檔案中為 persistence-unit 提供的相同唯一名稱來建立永續性單元。entitymanagerfactory 物件將使用createEntityManager ()方法建立 entitymanger 例項。entitymanager 物件為事務管理建立 entitytransaction 例項。透過使用 entitymanager 物件,我們可以將實體持久化到資料庫中。

編譯並執行上述程式後,您將在 Eclipse IDE 的控制檯面板上收到來自 eclipselink 庫的通知。

對於結果,開啟 MySQL 工作臺並鍵入以下查詢。

use jpadb
select * from employee

受影響的資料庫表名為employee,將以表格格式顯示如下

Eid Ename Salary Deg
1201 Gopal 40000 技術經理

更新員工

要更新員工,我們需要從資料庫中獲取記錄,進行更改,最後提交它。名為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 技術經理

員工 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,將包含空記錄。

完成此示例中的所有模組後,包和檔案層次結構如下所示

Modules
廣告

© . All rights reserved.