3、JPA操作步骤与解决EntityManagerFactory对象创建耗时问题

摘要:
1.加载配置文件以创建实体管理器工厂EntityManagerFactoryfactory=Persistence createEntityManagerFactory(“myJpa”);持久性:静态方法(根据持久性单元的名称创建实体管理器工厂)createEntityMnagerFactory(持久性单元名称)函数:创建实体管理程序工厂2.根据实体管理器厂创建实体管理者Entit
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()

免责声明:文章转载自《3、JPA操作步骤与解决EntityManagerFactory对象创建耗时问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何插入并引用带有章节号的题注?spring装配bean的三种方式及其混合装配下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于JPA的分页/排序实现

Page<ClassOrder> findByMember_MemberID(long id, Pageable pageable);Controller代码: public ModelAndView showsignupclass(int page){ ModelAndView mv=new ModelAndView("/...

【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中

执行了save()方法  sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提交事务,所以这一条语句已经插入到数据库了,但是当前不可见。 所以最后可以采用 this.userRepository.saveAndFlush() 方法,让它...

spring boot jpa

spring boot jpa 访问数据库的方式一般来说有两种,一种以Java Entity为中心,将实体和实体关系对应到数据库的表和表关系,例如Hibernate框架(Spring Data JPA由此实现);另一种以原生SQL为中心,更加灵活便捷,例如Mybatis。这里重点介绍下Spring Data JPA技术。 spring boot jpa介绍...

【hibernate/JPA】注解方式实现 复合主键【spring boot】

1》hibernate/JPA实现复合主键的思路:是将所有的主键属性封装在一个主键类中,提供给需要复合主键的实体类使用。 2》主键类的几点要求: 1. 使用复合主键的实体类必须实现Serializable接口。 必须实现Serializable接口的原因很简单,我们查找数据的时候是根据主键查找的。打开Hibernate的帮助文档我们可以找到get与loa...

spring mvc 的jpa JpaRepository数据层 访问方式汇总

本文转载:http://perfy315.iteye.com/blog/1460226和http://jishiweili.iteye.com/blog/2088265 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spring Data相关知识作一个较为详细的描述。1.Spring Data所解决的...

spring data jpa的动态查询封装(转)

最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification Java代码   /**   * 定义一个查询条件容器   * @author lee   *   * @param <T>   */   public cl...