hibernate 管理 Session(单独使用session,非spring)
生活随笔
收集整理的這篇文章主要介紹了
hibernate 管理 Session(单独使用session,非spring)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
hibernate 管理 Session(單獨使用session,非spring)
在 Hibernate 的配置文件里, hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包含
假設把 Hibernate 配置文件的 hibernate.current_session_context_class 屬性值設為 thread, Hibernate 就會依照與本地線程綁定的方式來管理 Session Hibernate 按下面規則把 Session 與本地線程綁定
代碼具體解釋: HibernateUtils.java(單例)
package com.atguigu.hibernate.hibernate;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder;public class HibernateUtils {private HibernateUtils(){}private static HibernateUtils instance = new HibernateUtils();public static HibernateUtils getInstance() {return instance;}private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {if (sessionFactory == null) {Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);}return sessionFactory;}public Session getSession(){return getSessionFactory().getCurrentSession();}}
DepartmentDao.java
package com.atguigu.hibernate.dao;import org.hibernate.Session;import com.atguigu.hibernate.entities.Department; import com.atguigu.hibernate.hibernate.HibernateUtils;public class DepartmentDao {public void save(Department dept){//內部獲取 Session 對象//獲取和當前線程綁定的 Session 對象//1. 不須要從外部傳入 Session 對象//2. 多個 DAO 方法也能夠使用一個事務!Session session = HibernateUtils.getInstance().getSession();System.out.println(session.hashCode());session.save(dept);}/*** 若須要傳入一個 Session 對象, 則意味著上一層(Service)須要獲取到 Session 對象.* 這說明上一層須要和 Hibernate 的 API 緊密耦合. 所以不推薦使用此種方式. */public void save(Session session, Department dept){session.save(dept);}}
Test package com.atguigu.hibernate.test;import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List;import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.jdbc.Work; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test;import com.atguigu.hibernate.dao.DepartmentDao; import com.atguigu.hibernate.entities.Department; import com.atguigu.hibernate.entities.Employee; import com.atguigu.hibernate.hibernate.HibernateUtils;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testManageSession(){//獲取 Session//開啟事務Session session = HibernateUtils.getInstance().getSession();System.out.println("-->" + session.hashCode());Transaction transaction = session.beginTransaction();DepartmentDao departmentDao = new DepartmentDao();Department dept = new Department();dept.setName("ATGUIGU");departmentDao.save(dept);departmentDao.save(dept);departmentDao.save(dept);//若 Session 是由 thread 來管理的, 則在提交或回滾事務時, 已經關閉 Session 了. transaction.commit();System.out.println(session.isOpen()); }}
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration><session-factory><!-- Hibernate 連接數據庫的基本信息 --><property name="connection.username">scott</property><property name="connection.password">java</property><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property><!-- Hibernate 的基本配置 --><!-- Hibernate 使用的數據庫方言 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 執行時是否打印 SQL --><property name="show_sql">true</property><!-- 執行時是否格式化 SQL --><property name="format_sql">true</property><!-- 生成數據表的策略 --><property name="hbm2ddl.auto">update</property><!-- 設置 Hibernate 的事務隔離級別 --><property name="connection.isolation">2</property><!-- 刪除對象后, 使其 OID 置為 null --><property name="use_identifier_rollback">true</property><!-- 配置 C3P0 數據源 --><!-- <property name="hibernate.c3p0.max_size">10</property><property name="hibernate.c3p0.min_size">5</property><property name="c3p0.acquire_increment">2</property><property name="c3p0.idle_test_period">2000</property><property name="c3p0.timeout">2000</property><property name="c3p0.max_statements">10</property>--><!-- 設定 JDBC 的 Statement 讀取數據的時候每次從數據庫中取出的記錄條數 --><property name="hibernate.jdbc.fetch_size">100</property><!-- 設定對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小 --><property name="jdbc.batch_size">30</property><!-- 啟用二級緩存 --><property name="cache.use_second_level_cache">true</property><!-- 配置使用的二級緩存的產品 --><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 配置啟用查詢緩存 --><property name="cache.use_query_cache">true</property><!-- 配置管理 Session 的方式 --><property name="current_session_context_class">thread</property><!-- 須要關聯的 hibernate 映射文件 .hbm.xml --><mapping resource="com/atguigu/hibernate/entities/Department.hbm.xml"/><mapping resource="com/atguigu/hibernate/entities/Employee.hbm.xml"/><class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/><class-cache usage="read-write" class="com.atguigu.hibernate.entities.Department"/><collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/></session-factory> </hibernate-configuration>
posted on 2017-06-02 18:58 mthoutai 閱讀(...) 評論(...) 編輯 收藏
Hibernate 自身提供了三種管理 Session 對象的方法
- Session 對象的生命周期與本地線程綁定
- Session 對象的生命周期與 JTA 事務綁定
- Hibernate 托付程序管理 Session 對象的生命周期
在 Hibernate 的配置文件里, hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包含
- thread: Session 對象的生命周期與本地線程綁定
- jta*: Session 對象的生命周期與 JTA 事務綁定
- managed: Hibernate 托付程序來管理 Session 對象的生命周期
假設把 Hibernate 配置文件的 hibernate.current_session_context_class 屬性值設為 thread, Hibernate 就會依照與本地線程綁定的方式來管理 Session Hibernate 按下面規則把 Session 與本地線程綁定
- 當一個線程(threadA)第一次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法會創建一個新的 Session(sessionA) 對象, 把該對象與 threadA 綁定, 并將 sessionA 返回
- 當 threadA 再次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法將返回 sessionA 對象
- 當 threadA 提交 sessionA 對象關聯的事務時, Hibernate 會自己主動flush sessionA 對象的緩存, 然后提交事務, 關閉 sessionA 對象. 當 threadA 撤銷 sessionA 對象關聯的事務時, 也會自己主動關閉 sessionA 對象
- 若 threadA 再次調用 SessionFactory 對象的 getCurrentSession() 方法時, 該方法會又創建一個新的 Session(sessionB) 對象, 把該對象與 threadA 綁定, 并將 sessionB 返回
代碼具體解釋: HibernateUtils.java(單例)
package com.atguigu.hibernate.hibernate;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder;public class HibernateUtils {private HibernateUtils(){}private static HibernateUtils instance = new HibernateUtils();public static HibernateUtils getInstance() {return instance;}private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {if (sessionFactory == null) {Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);}return sessionFactory;}public Session getSession(){return getSessionFactory().getCurrentSession();}}
DepartmentDao.java
package com.atguigu.hibernate.dao;import org.hibernate.Session;import com.atguigu.hibernate.entities.Department; import com.atguigu.hibernate.hibernate.HibernateUtils;public class DepartmentDao {public void save(Department dept){//內部獲取 Session 對象//獲取和當前線程綁定的 Session 對象//1. 不須要從外部傳入 Session 對象//2. 多個 DAO 方法也能夠使用一個事務!Session session = HibernateUtils.getInstance().getSession();System.out.println(session.hashCode());session.save(dept);}/*** 若須要傳入一個 Session 對象, 則意味著上一層(Service)須要獲取到 Session 對象.* 這說明上一層須要和 Hibernate 的 API 緊密耦合. 所以不推薦使用此種方式. */public void save(Session session, Department dept){session.save(dept);}}
Test package com.atguigu.hibernate.test;import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List;import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.jdbc.Work; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test;import com.atguigu.hibernate.dao.DepartmentDao; import com.atguigu.hibernate.entities.Department; import com.atguigu.hibernate.entities.Employee; import com.atguigu.hibernate.hibernate.HibernateUtils;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testManageSession(){//獲取 Session//開啟事務Session session = HibernateUtils.getInstance().getSession();System.out.println("-->" + session.hashCode());Transaction transaction = session.beginTransaction();DepartmentDao departmentDao = new DepartmentDao();Department dept = new Department();dept.setName("ATGUIGU");departmentDao.save(dept);departmentDao.save(dept);departmentDao.save(dept);//若 Session 是由 thread 來管理的, 則在提交或回滾事務時, 已經關閉 Session 了. transaction.commit();System.out.println(session.isOpen()); }}
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration><session-factory><!-- Hibernate 連接數據庫的基本信息 --><property name="connection.username">scott</property><property name="connection.password">java</property><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property><!-- Hibernate 的基本配置 --><!-- Hibernate 使用的數據庫方言 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 執行時是否打印 SQL --><property name="show_sql">true</property><!-- 執行時是否格式化 SQL --><property name="format_sql">true</property><!-- 生成數據表的策略 --><property name="hbm2ddl.auto">update</property><!-- 設置 Hibernate 的事務隔離級別 --><property name="connection.isolation">2</property><!-- 刪除對象后, 使其 OID 置為 null --><property name="use_identifier_rollback">true</property><!-- 配置 C3P0 數據源 --><!-- <property name="hibernate.c3p0.max_size">10</property><property name="hibernate.c3p0.min_size">5</property><property name="c3p0.acquire_increment">2</property><property name="c3p0.idle_test_period">2000</property><property name="c3p0.timeout">2000</property><property name="c3p0.max_statements">10</property>--><!-- 設定 JDBC 的 Statement 讀取數據的時候每次從數據庫中取出的記錄條數 --><property name="hibernate.jdbc.fetch_size">100</property><!-- 設定對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小 --><property name="jdbc.batch_size">30</property><!-- 啟用二級緩存 --><property name="cache.use_second_level_cache">true</property><!-- 配置使用的二級緩存的產品 --><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 配置啟用查詢緩存 --><property name="cache.use_query_cache">true</property><!-- 配置管理 Session 的方式 --><property name="current_session_context_class">thread</property><!-- 須要關聯的 hibernate 映射文件 .hbm.xml --><mapping resource="com/atguigu/hibernate/entities/Department.hbm.xml"/><mapping resource="com/atguigu/hibernate/entities/Employee.hbm.xml"/><class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/><class-cache usage="read-write" class="com.atguigu.hibernate.entities.Department"/><collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/></session-factory> </hibernate-configuration>
posted on 2017-06-02 18:58 mthoutai 閱讀(...) 評論(...) 編輯 收藏
轉載于:https://www.cnblogs.com/mthoutai/p/6934796.html
總結
以上是生活随笔為你收集整理的hibernate 管理 Session(单独使用session,非spring)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js下载文件及命名(兼容多浏览器)
- 下一篇: bzoj 1468 Tree(点分治模板