位置:首頁 > Java技術 > JPA教學 > JPA實體管理器

JPA實體管理器

本章將使用一個簡單的例子來說明JPA是如何工作的。讓我們來考慮以員工管理為例。假設員工管理分彆創建,更新,查找和刪除員工的記錄操作。正如前麵提到的,使用MySQL數據庫進行數據庫操作。

對於此示例中的主要模塊如下:

  • 模型或POJO

    Employee.java

  • 持久化

    Persistence.xml

  • 服務

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

讓我們看看,我們已經使用了JPA安裝EclipseLink包的層次。按照分層結構的此示例中,如下所示:

Package Hierarchy

創建實體

實體是什麼?無非是bean或model。在這個例子中,我們將使用員工作為一個實體。 eid, ename, salary, 和deg是實體的屬性。它包含一個默認的構造函數,以及這些屬性的setter和getter方法。

在上圖所示的層次結構,創建一個名為“com.yiibai.eclipselink.entity'包,在'src'中(源)封裝。給包下創建一個名為Employee.java類,如下所示:

package com.yiibai.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.yiibai.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屬性。此文件將配置數據庫。

持久化操作

用於與一個數據庫進行交互持久性操作,它們加載和存儲操作。在一個業務組件,所有的持久化操作屬於服務類。

在上麵的圖示包層次結構,創建一個名為“com.yiibai.eclipselink.service'包,在'src'中(源)封裝。所有命名為CreateEmloyee.java,UpdateEmployee.java,FindEmployee.java和DeleteEmployee.java 服務類。來自給定的包下,如下所示:

創建Employee

下麵的代碼段說明了如何創建一個名為CreateEmployee.java的一個Employee類。

package com.yiibai.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.yiibai.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 文件提供持久化單元相同唯一的名稱創建一個持久性單元。 EntityManagerFactory對象將由usingcreateEntityManager()方法創建entitymanger實例。 EntityManager對象創建 entitytransactioninstance 事務管理。通過使用 EntityManager 對象,我們可以持久化實體到數據庫中。

編譯和執行上述程序後,會從庫中的EclipseLink得到通知在Eclipse IDE的控製台麵板上。

對於結果,打開 MySQL 工作台,然後輸入以下的查詢。

use jpadb
select * from employee

命名為 employee 受影響的數據庫表將顯示在表格格式如下:

Eid Ename Salary Deg
1201 Gopal 40000 Technical Manager

更新Employee

要更新員工的記錄,我們需要檢索現有記錄形成數據庫,進行修改,最後提交到數據庫中。名為UpdateEmployee.java類如下所示:

package com.yiibai.eclipselink.service;

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

編譯和執行上述程序後,會從庫中的EclipseLink得到通知在Eclipse IDE的控製台麵板上。

對於結果,打開MySQL工作台,然後輸入以下的查詢。

use jpadb
select * from employee

命名為employee受影響的數據庫表將顯示在表格格式如下:

Eid Ename Salary Deg
1201 Gopal 46000 Technical Manager

員工的工資為1201將更新為46000。

查找Employee

找一個雇員的記錄,從數據庫中檢索現有數據並顯示它。在該操作中,EntityTransaction 未在檢索的記錄中應用。

命名類 FindEmployee.java如下。

package com.yiibai.eclipselink.service;

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

編譯並執行上述程序後,從庫中的EclipseLink 會得到以下輸出在 Eclipse IDE 控製台麵板上。

employee ID = 1201
employee NAME = Gopal
employee SALARY = 46000.0
employee DESIGNATION = Technical Manager

刪除員工

要刪除一個員工的記錄,首先我們會發現現有的記錄,然後刪除它。這裡 EntityTransaction 起著重要的作用。

命名 DeleteEmployee.java 類如下:

package com.yiibai.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.yiibai.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