JPA(API)

一、java

Persistence  git

EntityManagerFactorygithub

二、數據庫

EntityManager#find緩存

EntityManager#getReferencesession

EntityManager#persistence測試

EntityManager#removeui

三、spa

EntityTransaction(事物)hibernate

四、EntityManager 其餘方法

五、EntityManager#merge

 

一、JPA相關接口/類:Persistence

.Persistence 類是用於獲取 EntityManagerFactory 實例。該類包含一個名爲 createEntityManagerFactory 的 靜態方法 。

.createEntityManagerFactory 方法有以下兩個重載版本。 帶有一個參數的方法以 JPA 配置文件 persistence.xml 中的持久化單元名爲參數 帶有兩個參數的方法:前一個參數含義相同,後一個參數 Map類型,用於設置 JPA 的相關屬性,這時將忽略其它地方設置的屬性。Map 對象的屬性名必須是 JPA 實現庫提供商的名字空間約定的屬性名。

二、EntityManagerFactory

EntityManagerFactory 接口主要用來建立 EntityManager 實例。該接口約定了以下4個方法:

<1>createEntityManager():用於建立實體管理器對象實例。

<2>createEntityManager(Map map):用於建立實體管理器對象實例的重載方法,Map 參數用於提供 EntityManager 的屬性。

<3>isOpen():檢查 EntityManagerFactory 是否處於打開狀態。實體管理器工廠建立後一直處於打開狀態,除非調用close()方法將其關閉。

<4>close():關閉 EntityManagerFactory 。 EntityManagerFactory 關閉後將釋放全部資源,isOpen()方法測試將返回 false,其它方法將不能調用,不然將致使IllegalStateException異常。

四、EntityManager

在 JPA 規範中, EntityManager 是完成持久化操做的核心對象。實體做爲普通 Java 對象,只有在調用 EntityManager 將其持久化後纔會變成持久化對象。EntityManager 對象在一組實體類與底層數據源之間進行 O/R 映射的管理。它能夠用來管理和更新 Entity Bean, 根椐主鍵查找 Entity Bean, 還能夠經過JPQL語句查詢實體。

實體的狀態: 新建狀態: 新建立的對象,還沒有擁有持久性主鍵

持久化狀態:已經擁有持久性主鍵並和持久化創建了上下文環境

遊離狀態:擁有持久化主鍵,可是沒有與持久化創建上下文環境

刪除狀態: 擁有持久化主鍵,已經和持久化創建上下文環境,可是從數據庫中刪除。

 

find (Class<T> entityClass,Object primaryKey):

返回指定的 OID 對應的實體類對象,若是這個實體存在於當前的持久化環境,則返回一個被緩存的對象;不然會建立一個新的 Entity, 並加載數據庫中相關信息;若 OID 不存在於數據庫中,則返回一個 null。第一個參數爲被查詢的實體類類型,第二個參數爲待查找實體的主鍵值。

 

getReference (Class<T> entityClass,Object primaryKey):

與find()方法相似,不一樣的是:若是緩存中不存在指定的 Entity, EntityManager 會建立一個 Entity 類的代理,可是不會當即加載數據庫中的信息,只有第一次真正使用此 Entity 的屬性才加載,因此若是此 OID 在數據庫不存在,getReference() 不會返回 null 值, 而是拋出EntityNotFoundException

persist (Object entity):

用於將新建立的 Entity 歸入到 EntityManager 的管理。該方法執行後,傳入 persist() 方法的 Entity 對象轉換成持久化狀態。

--若是傳入 persist() 方法的 Entity 對象已經處於持久化狀態,則 persist() 方法什麼都不作。

--若是對刪除狀態的 Entity 進行 persist() 操做,會轉換爲持久化狀態。

--若是對遊離狀態的實體執行 persist() 操做,可能會在 persist() 方法拋出 EntityExistException(也有多是在flush或事務提交後拋出)。

remove (Object entity)

刪除實例。若是實例是被管理的,即與數據庫實體記錄關聯,則同時會刪除關聯的數據庫記錄。

 

 

merge (T entity):merge() 用於處理 Entity 的同步。即數據庫的插入和更新操做

 

 

EntityTransaction(事物管理)

EntityTransaction 接口用來管理資源層實體管理器的事務操做。經過調用實體管理器的getTransaction方法 得到其實例。

begin ()

----用於啓動一個事務,此後的多個數據庫操做將做爲總體被提交或撤消。若這時事務已啓動則會拋出 IllegalStateException 異常。

commit ()

----用於提交當前事務。即將事務啓動之後的全部數據庫更新操做持久化至數據庫中。

rollback ()

-----撤消(回滾)當前事務。即撤消事務啓動後的全部數據庫更新操做,從而不對數據庫產生影響。

setRollbackOnly ()

-----使當前事務只能被撤消。

getRollbackOnly ()

----查看當前事務是否設置了只能撤消標誌。

isActive ()

 -----查看當前事務是不是活動的。若是返回true則不能調用begin方法,不然將拋出 IllegalStateException 異常;

若是返回 false 則不能調用 commit、rollback、setRollbackOnly 及 getRollbackOnly 方法,不然將拋出 IllegalStateException 異常。

 

相關測試代碼:

 

package com.jpa.test;



import java.util.Date;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.guigu.jpa.helloword.Customer;

public class JPATest {
    private EntityManagerFactory entityManagerFactory;
    private EntityManager entityManager;
    private EntityTransaction transaction;
    @Before
    public void init(){
        entityManagerFactory= Persistence.createEntityManagerFactory("jpa-1");
        entityManager=entityManagerFactory.createEntityManager();
        transaction=entityManager.getTransaction();
        transaction.begin();//開啓事務
        
    }
    @After
    public void destroy(){
        transaction.commit();
        entityManager.close();
        entityManagerFactory.close();
    }
    
    /**
     * 若傳入得是一個遊離狀態的對象,即傳入的對象有OID
     * 一、若在EntityManager緩存中有該對象
     * 二、JPA會把遊離狀態的屬性複製到EntityManager緩存中的對象中
     * 三、EntityManager緩存中的對象象執行update
     */
    @Test
    public void testMerge4(){
        Customer customer=new Customer();
        customer.setAge(16);
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("dd@163.com");
        customer.setLastName("DD");
        customer.setId(4);
    
        Customer customer2=entityManager.find(Customer.class, 4);
        
        entityManager.merge(customer);
        System.out.println(customer==customer2);//false
        
    }
    
    /**
     * 若傳入得是一個遊離狀態的對象,即穿入的對象有OID
     * 一、若在EntityManager緩存中沒有該對象
     * 二、若在數據庫中有改記錄
     * 3JPA會查詢對應的記錄,而後返回該記錄對應的一個對象,再而後會把遊離對象的屬性複製到查詢到的對象中
     * 四、對查詢到的對象執行update操做
     */
    @Test
    public void testMerge3(){
        Customer customer=new Customer();
        customer.setAge(16);
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("ee@163.com");
        customer.setLastName("EE");
        customer.setId(4);
        Customer customer2=entityManager.merge(customer);
        System.out.println(customer==customer2);//false
        
    }
    
    
    /**
     * 若傳入得是一個遊離狀態的對象,即穿入的對象有OID
     * 一、若在EntityManager緩存中沒有該對象
     * 二、若在數據庫中也沒有改記錄
     * 3JPA會建立一個新對象,而後把前遊離對象的屬性複製到新建立的對象中
     * 四、對新建立的對象執行insert操做
     */
    @Test
    public void testMerge2(){
        Customer customer=new Customer();
        customer.setAge(16);
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("hello@163.com");
        customer.setLastName("李四");
        customer.setId(100);
        Customer customer2=entityManager.merge(customer);
        System.out.println("customer#id"+customer.getId());
        System.out.println("customer2#id"+customer2.getId());
        
    }
    
    
    /*
     * 總的來講:相似於hibernate session 的saveOrUpdate方法
     * 1.若傳入得是一個臨時對象則會建立一個新對象,把零時對象的屬性複製到新對象中,而後對新對象執行持久化操做
     * 因此新的對象有id,可是之前的零時對象中沒有id
     */
    @Test
    public void testMerge1(){
        Customer customer=new Customer();
        customer.setAge(16);
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("hello@163.com");
        customer.setLastName("李四");
        
        Customer customer2=entityManager.merge(customer);
        System.out.println("customer#id"+customer.getId());
        System.out.println("customer2#id"+customer2.getId());
        
    }
    //相似於hibernated的delete方法,把對象對應的記錄從數據庫中移除
    //但注意:該方法只能移除持久化對象,而hibernate的delete方法實際上還能夠移除遊離對象
    @Test
    public void testRemove(){
//        Customer customer =new Customer();
//        customer.setId(2);
        Customer customer=entityManager.find(Customer.class, 2);
        entityManager.remove(customer);
        
        
        
        
    }
    
    //相似於hibernate的save方法使對象由臨時狀態轉變爲持久化狀態
    //和hibernatede save方法不一樣之處:對象由id則不能執行insert操做,會拋出異常
    @Test
    public void testPersistence(){
        Customer customer=new Customer();
        customer.setAge(22);
        
        customer.setBirth(new Date());
        customer.setCreatedTime(new Date());
        customer.setEmail("@123456.conm");    
        customer.setLastName("張三");
//        customer.setId(100);//hi拋出異常
        entityManager.persist(customer);
        System.err.println(customer.getId());
        
    }
    
    //相似於hibernate 中的session中的load方法
    @Test
    public void testGetReference(){
        Customer customer=entityManager.getReference(Customer.class, 1);//1表示id
        System.out.println(customer.getClass().getName());
        System.out.println("-------------------------------");
//        transaction.commit();
//        entityManagerFactory.close();
        System.out.println(customer);
        
    }
    //相似於hibernate 中的session中的get方法
    @Test
    public void testFind(){
        Customer customer=entityManager.find(Customer.class, 1);//1表示id
        System.out.println("-------------------------------");
        System.out.println(customer);
        
    }

}

 

 

 

 

完整 源碼地址:https://github.com/wuhongpu/JPA.git

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息