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 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 的記錄為空。
在此示例中所有的模塊完成後,將包和文件的層次結構如下所示: