JPA實體管理器
本章將使用一個簡單的例子來說明JPA是如何工作的。讓我們來考慮以員工管理爲例。假設員工管理分別創建,更新,查找和刪除員工的記錄操作。正如前面提到的,使用MySQL數據庫進行數據庫操作。
對於此示例中的主要模塊如下:
模型或POJO
Employee.java
持久化
Persistence.xml
服務
CreatingEmployee.java
UpdatingEmployee.java
FindingEmployee.java
DeletingEmployee.java
讓我們看看,我們已經使用了JPA安裝EclipseLink包的層次。按照分層結構的此示例中,如下所示:
創建實體
實體是什麼?無非是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,**
持久化操作
用於與一個數據庫進行交互持久性操作,它們加載和存儲操作。在一個業務組件,所有的持久化操作屬於服務類。
在上面的圖示包層次結構,創建一個名爲「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 的記錄爲空。
在此示例中所有的模塊完成後,將包和文件的層次結構如下所示: