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