~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
管理Session
一. Hibernate 自身提供了 3种管理Session 对象的方法
①. Session 对象的生命周期与本地线程绑定
②. Session 对象的生命周期与JTA 事务绑定
③. Hibernate 委托程序管理Session 对象的生命周期
二. 在 Hibernate 的配置文件中 hibernate.current_session_context_class 属性用于 指定Session 管理方式,可选值包括3种
①.thread: Session 对象的生命周期与本地线程绑定
②. jta*: Session 对象的生命周期与JTA 事务绑定
③. managed: Hibernate 委托程序管理Session 对象的生命周期
推荐第一种
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面以第一种为例配置Hibernate 如何session 的管理步骤:
①. 在Hibernate 的配置文件hibernate.cfg.xml 中配置 hibernate.current_session_context_class
thread
②. 创建管理session 的类HibernateUtils.java
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 {
//hIbernate的构造器
public HibernateUtils(){}
//获取Hibernte的单实例
private static HibernateUtils instance = new HibernateUtils();
public static HibernateUtils getInstance(){
return instance;
}
//获取sessionFactory
private SessionFactory sessionFactory;
public SessionFactory getSessionFaction(){
if(sessionFactory == null){
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
return sessionFactory;
}
// 通过getCurrentSession() 可以把 session和 当前线程绑定 :Current 的意思是:当前的
public Session getSession(){
return getSessionFaction().getCurrentSession();
}
}
@Test
public void testHibernateManageSession(){
//获取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("ChuckHero");
departmentDAO.save(dept);
departmentDAO.save(dept);
departmentDAO.save(dept);
//若 Session 是由 thread 来管理的,则 在提交或回滚事务后,就 已经关闭Session
System.out.println( "session.isOpen()1: " + session.isOpen());
transaction.commit();
System.out.println( "session.isOpen()2: " + session.isOpen());
}
-->852989707
session.hashCode: 852989707
Hibernate:
select
user_deptid.nextval
from
dual
session.hashCode: 852989707
session.hashCode: 852989707
session.isOpen()1: true
Hibernate:
insert
into
BB_DEPARTMENTS
(NAME, ID)
values
(?, ?)
session.isOpen()2: false
批量操作数据 时,通过 JDBC 原生的 API 进行操作, 效率最高, 速度最快!
//方法如下获取Connection
@Test
public void testHibernateBath(){
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
//通过 JDBC 原生的 API 进行操作, 效率最高, 速度最快!
}
});
}