Hibernate—session与transaction

    xiaoxiao2021-12-14  19

    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是一种单例模式。

    转载请注明原文地址: https://ju.6miu.com/read-970418.html

    最新回复(0)