hibernate 管理 Session(单独使用session,非spring)
生活随笔
收集整理的這篇文章主要介紹了
hibernate 管理 Session(单独使用session,非spring)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
hibernate 管理 Session(單獨(dú)使用session,非spring)
在 Hibernate 的配置文件里, hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包含
假設(shè)把 Hibernate 配置文件的 hibernate.current_session_context_class 屬性值設(shè)為 thread, Hibernate 就會(huì)依照與本地線程綁定的方式來(lái)管理 Session Hibernate 按下面規(guī)則把 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){//內(nèi)部獲取 Session 對(duì)象//獲取和當(dāng)前線程綁定的 Session 對(duì)象//1. 不須要從外部傳入 Session 對(duì)象//2. 多個(gè) DAO 方法也能夠使用一個(gè)事務(wù)!Session session = HibernateUtils.getInstance().getSession();System.out.println(session.hashCode());session.save(dept);}/*** 若須要傳入一個(gè) Session 對(duì)象, 則意味著上一層(Service)須要獲取到 Session 對(duì)象.* 這說(shuō)明上一層須要和 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//開啟事務(wù)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 來(lái)管理的, 則在提交或回滾事務(wù)時(shí), 已經(jīng)關(guān)閉 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 連接數(shù)據(jù)庫(kù)的基本信息 --><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 使用的數(shù)據(jù)庫(kù)方言 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 執(zhí)行時(shí)是否打印 SQL --><property name="show_sql">true</property><!-- 執(zhí)行時(shí)是否格式化 SQL --><property name="format_sql">true</property><!-- 生成數(shù)據(jù)表的策略 --><property name="hbm2ddl.auto">update</property><!-- 設(shè)置 Hibernate 的事務(wù)隔離級(jí)別 --><property name="connection.isolation">2</property><!-- 刪除對(duì)象后, 使其 OID 置為 null --><property name="use_identifier_rollback">true</property><!-- 配置 C3P0 數(shù)據(jù)源 --><!-- <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>--><!-- 設(shè)定 JDBC 的 Statement 讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù) --><property name="hibernate.jdbc.fetch_size">100</property><!-- 設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小 --><property name="jdbc.batch_size">30</property><!-- 啟用二級(jí)緩存 --><property name="cache.use_second_level_cache">true</property><!-- 配置使用的二級(jí)緩存的產(chǎn)品 --><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><!-- 須要關(guān)聯(lián)的 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 閱讀(...) 評(píng)論(...) 編輯 收藏
Hibernate 自身提供了三種管理 Session 對(duì)象的方法
- Session 對(duì)象的生命周期與本地線程綁定
- Session 對(duì)象的生命周期與 JTA 事務(wù)綁定
- Hibernate 托付程序管理 Session 對(duì)象的生命周期
在 Hibernate 的配置文件里, hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包含
- thread: Session 對(duì)象的生命周期與本地線程綁定
- jta*: Session 對(duì)象的生命周期與 JTA 事務(wù)綁定
- managed: Hibernate 托付程序來(lái)管理 Session 對(duì)象的生命周期
假設(shè)把 Hibernate 配置文件的 hibernate.current_session_context_class 屬性值設(shè)為 thread, Hibernate 就會(huì)依照與本地線程綁定的方式來(lái)管理 Session Hibernate 按下面規(guī)則把 Session 與本地線程綁定
- 當(dāng)一個(gè)線程(threadA)第一次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法會(huì)創(chuàng)建一個(gè)新的 Session(sessionA) 對(duì)象, 把該對(duì)象與 threadA 綁定, 并將 sessionA 返回
- 當(dāng) threadA 再次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法將返回 sessionA 對(duì)象
- 當(dāng) threadA 提交 sessionA 對(duì)象關(guān)聯(lián)的事務(wù)時(shí), Hibernate 會(huì)自己主動(dòng)flush sessionA 對(duì)象的緩存, 然后提交事務(wù), 關(guān)閉 sessionA 對(duì)象. 當(dāng) threadA 撤銷 sessionA 對(duì)象關(guān)聯(lián)的事務(wù)時(shí), 也會(huì)自己主動(dòng)關(guān)閉 sessionA 對(duì)象
- 若 threadA 再次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法會(huì)又創(chuàng)建一個(gè)新的 Session(sessionB) 對(duì)象, 把該對(duì)象與 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){//內(nèi)部獲取 Session 對(duì)象//獲取和當(dāng)前線程綁定的 Session 對(duì)象//1. 不須要從外部傳入 Session 對(duì)象//2. 多個(gè) DAO 方法也能夠使用一個(gè)事務(wù)!Session session = HibernateUtils.getInstance().getSession();System.out.println(session.hashCode());session.save(dept);}/*** 若須要傳入一個(gè) Session 對(duì)象, 則意味著上一層(Service)須要獲取到 Session 對(duì)象.* 這說(shuō)明上一層須要和 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//開啟事務(wù)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 來(lái)管理的, 則在提交或回滾事務(wù)時(shí), 已經(jīng)關(guān)閉 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 連接數(shù)據(jù)庫(kù)的基本信息 --><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 使用的數(shù)據(jù)庫(kù)方言 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 執(zhí)行時(shí)是否打印 SQL --><property name="show_sql">true</property><!-- 執(zhí)行時(shí)是否格式化 SQL --><property name="format_sql">true</property><!-- 生成數(shù)據(jù)表的策略 --><property name="hbm2ddl.auto">update</property><!-- 設(shè)置 Hibernate 的事務(wù)隔離級(jí)別 --><property name="connection.isolation">2</property><!-- 刪除對(duì)象后, 使其 OID 置為 null --><property name="use_identifier_rollback">true</property><!-- 配置 C3P0 數(shù)據(jù)源 --><!-- <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>--><!-- 設(shè)定 JDBC 的 Statement 讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù) --><property name="hibernate.jdbc.fetch_size">100</property><!-- 設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小 --><property name="jdbc.batch_size">30</property><!-- 啟用二級(jí)緩存 --><property name="cache.use_second_level_cache">true</property><!-- 配置使用的二級(jí)緩存的產(chǎn)品 --><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><!-- 須要關(guān)聯(lián)的 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 閱讀(...) 評(píng)論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/mthoutai/p/6934796.html
總結(jié)
以上是生活随笔為你收集整理的hibernate 管理 Session(单独使用session,非spring)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js下载文件及命名(兼容多浏览器)
- 下一篇: bzoj 1468 Tree(点分治模板