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()

posted @ 2020-08-18 08:29  lawrence林  阅读(1364)  评论(0编辑  收藏  举报