session可以理解为操作数据库的对象。
transaction:hibernate对数据的操作都是封装在事务中,默认为非自动提交。所以使用seesion,先把session封装在事务中,然后提交事务。
也可使用session的dowork()方法,并设置提交事务模式。来变成自动提交jdbc的模式。
junit测试用例:
package Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
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 Ab.Student;
public class StudentTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂
sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象
session=sessionFactory.openSession();
//开启事务
//transaction=session.beginTransaction();
}
@After
public void destory(){
//提交事务
//transaction.commit();
//关闭会话
session.close();
//关闭工厂
sessionFactory.close();
}
@Test
public void testSaveStudent(){
//生成学生对象
Student s=new Student(3,"王大","男",new Date(),"杭州");
//dowork方法
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
//设置为自动提交事务模式
connection.setAutoCommit(true);
}
});
session.save(s);//保存对象
session.flush();//强制输出sql语句
}
}
红色的部分是dowork方法的代码,最后加一个flush()来强制输出sql语句,不然无法完成。
那么如何获取session对象:
1、opensession()
2、getCurrentSession()
使用junit4来创建一个例子:
package Test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class SessionTest {
@Test
public void testOpenSession(){
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象
Session session=sessionFactory.openSession();
if(session==null){
System.out.println("OpenSession创建失败");
}else{
System.out.println("OpenSession创建成功");
}
}
@Test
//使用getCurrentSession()时需要注意在cfg.xml文件中加上<property name="hibernate.current_session_context_class">thread</property>jdbc本地事务
public void testGetCurrentSession(){
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象
Session session=sessionFactory.getCurrentSession();
if(session==null){
System.out.println("getCurrentSession()创建失败");
}else{
System.out.println("getCurrentSession()创建成功");
}
}
}
getCurrentSession和openSession的区别:
1、getCurrentSession()在事务提交或回滚之后,可以自动关闭,而opensession需要手动关闭。若没有及时关闭,会导致连接池的溢出,资源枯竭
2、opensession每次都创建新的session对象,而getCurrentSession使用现有的session对象。getCurrentSession是一种单例模式。