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

  • 相关阅读:
    Python 爬虫的工具列表
    使用rabbitmq手动确认消息的,定时获取队列消息实现
    redis订阅发布简单实现
    ubuntu下打开html页面
    关系数据库基本术语
    事务的基本概念,附图示
    oracle 一对多数据分页查询筛选
    一个在linux环境执行io操作的bug
    再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题
    oracle存储过程删除树状结构的表数据
  • 原文地址:https://www.cnblogs.com/Ryuichi/p/13504099.html
Copyright © 2011-2022 走看看