zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    《C++必知必会》读书笔记
    看美图是一种享受
    C指针-指向另一指针的指针
    顺序队列基本操作
    Using Windows Live Writer to write first offline blog
    堆和栈的区别 [摘录]
    进程与线程的区别
    《Effective C#》
    析构函数virtual与非virtual区别
    常用SQL语句技法
  • 原文地址:https://www.cnblogs.com/Ryuichi/p/13504099.html
Copyright © 2011-2022 走看看