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