JPA實體管理器

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

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

  • 模型或POJO

    Employee.java

  • 持久化

    Persistence.xml

  • 服務

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

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

Package

創建實體

實體是什麼?無非是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 如下:

com.yiibai.eclipselink.entity.Employee

在上面的XML,**標籤定義JPA持久性的特定名稱。標記定義了包名的實體類。標籤定義的所有屬性,而**標記的每個屬性定義,例如數據庫註冊,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