- JPA 教程
- JPA - 首頁
- JPA - 簡介
- JPA - 架構
- JPA - ORM 元件
- JPA - 安裝
- JPA - 實體管理器
- JPA - JPQL
- JPA - 高階對映
- JPA - 實體關係
- JPA - Criteria API
- JPA 有用資源
- JPA - 快速指南
- JPA - 有用資源
JPA - 實體管理器
本章將帶您瞭解 JPA 的簡單示例。讓我們以員工管理為例。這意味著員工管理是建立、更新、查詢和刪除員工。如上所述,我們使用 MySQL 資料庫進行資料庫操作。
此示例的主要模組如下所示
模型或 POJO
Employee.java
持久化
Persistence.xml
服務
CreatingEmployee.java
UpdatingEmployee.java
FindingEmployee.java
DeletingEmployee.java
讓我們採用在使用 Eclipselink 進行 JPA 安裝時使用的包層次結構。請按照以下示例的層次結構
建立實體
實體只不過是 Bean 或模型,在此示例中,我們將使用Employee作為實體。eid、ename、salary和deg是此實體的屬性。它包含這些屬性的預設建構函式、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,將包含空記錄。
完成此示例中的所有模組後,包和檔案層次結構如下所示