3、JPA操作步驟與解決EntityManagerFactory對象創建耗時問題


1.加載配置文件創建實體管理器工廠

EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");

  Persisitence:靜態方法(根據持久化單元名稱創建實體管理器工廠)
        createEntityMnagerFactory(持久化單元名稱)
  作用:創建實體管理器工廠

2.根據實體管理器工廠,創建實體管理器

EntityManager entityManager = factory.createEntityManager();

  EntityManagerFactory :獲取EntityManager對象
  方法:createEntityManager
  內部維護的很多的內容
        內部維護了數據庫信息,
        維護了緩存信息
        維護了所有的實體管理器對象
        再創建EntityManagerFactory的過程中會根據配置創建數據庫表
  EntityManagerFactory的創建過程比較浪費資源
  特點:線程安全的對象
        多個線程訪問同一個EntityManagerFactory不會有線程安全問題
              如何解決EntityManagerFactory的創建過程浪費資源(耗時)的問題?
              思路:創建一個公共的EntityManagerFactory的對象
                    靜態代碼塊的形式創建EntityManagerFactory

解決辦法:抽取工具類

/**
 * 解決實體管理器工廠的浪費資源和耗時問題
 *      通過靜態代碼塊的形式,當程序第一次訪問此工具類時,創建一個公共的實體管理器工廠對象
 *
 * 第一次訪問getEntityManager方法,經過靜態代碼創建一個factory對象,再調用方法創建一個EntityManager對象
 * 第二次方法getEntityManager方法,直接通過一個已經創建好的factory對象,創建EntityManager對象
 */
public class JpaUtils {
    private static EntityManagerFactory factory;

    static {
        //1、加載配置文件,創建entityManagerFactory
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /**
     * 獲取EntityManager對象
     */
    public static EntityManager getEntityManager(){
        return factory.createEntityManager();
    }
}

修改測試類

/**
  * 此時前兩步通過工具類來完成,由於該對象工廠在靜態代碼塊中創建,多個訪問同一個工廠,所以不能關閉
  * 靜態代碼塊,只初始化一次
  */
    @Test
    public void testInsert(){
        //1.加載配置文件創建工廠(實體類工廠)對象
//        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
        //2.通過實體管理器工廠獲取實體管理器
//        EntityManager entityManager = factory.createEntityManager();
        EntityManager entityManager = JpaUtils.getEntityManager();
        //3.獲取事務對象,開啟事務
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //4.完成增刪改查操作
        Users user = new Users();
        user.setUserName("小黑");
        user.setUser_sex("男");
        //保存
        entityManager.persist(user);
        //5.提交事務(回滾事務)
        transaction.commit();
        //6.釋放資源
        entityManager.close();
//        factory.close();
    }	

3.創建事務對象,開啟事務

EntityTransaction transaction = entityManager.getTransaction();

  EntityManager對象:實體類管理器
        getTransaction : 創建事務對象

transaction.begin();

  Transaction 對象 : 事務
        begin:開啟事務
        commit:提交事務
        rollback:回滾

4.增刪改查操作

  EntityManager對象:實體類管理器
        persist : 保存
        merge  : 更新
        remove : 刪除
        find/getRefrence : 根據id查詢

5.提交事務

transaction.commit();

6.釋放資源

entityManager.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM