zoukankan      html  css  js  c++  java
  • hibernate的事务管理和session对象的详解

    		//开启事务
    		transaction=session.beginTransaction();
    

     上面为开启事务

    transaction.commit();这个为提交事务

    从session对象中获取事务后进行提交

    下面可以自动提交事务,并且可以不需要对于这个事务进行提交,但是不推荐这样进行使用这个方法

    		session.doWork(new Work() {
    			//这里的connection对象就是jdbc中的对象
    			@Override
    			public void execute(Connection connection) throws SQLException {
    				// TODO Auto-generated method stub
    				connection.setAutoCommit(true);//设置自动提交事务
    			}
    		});
    

     在设置自动提交事务后必须对session进行刷新操作后才能有效

    	session.flush();//对于事务设成自动提交后需要对session进行刷新后才能使用
    

     openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;如果不关闭会导致每次都打开一个connection对象,最后导致连接池溢出


    getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 ;
    一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
    如何获得session对象???
    (1)openSessionion
    (2)getCurrentSession
    如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
    如果是本地事务(jdbc事务)
    <property name="hibernate.current_session_context_class">thread</property>
    如果是全局事务(jta事务)
    <property name="hibernate.current_session_context_class">jta</property>

    package cn.lonecloud.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 configuration = new Configuration().configure();// 获得配置文件对象
    		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    				.buildServiceRegistry();//获得服务注册对象
    		SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象
    		Session session=factory.openSession();//获取session对象
    		if (session!=null) {
    			System.out.println("Session 创建成功");
    		}else {
    			System.out.println("Session 创建失败");
    		}
    
    	}
    	//在使用getCurrentSession的时候必须在cfg配置文件中进行配置
    	// 		<!--设置当前的session对象的类型thead为当前的jdbc的session对象 -->
    //	<!-- 如果是本地事务(jdbc事务) -->
    //	<property name="hibernate.current_session_context_class">thread</property>
    //<!-- 		如果是全局事务(jta事务)
    //	<property name="hibernate.current_session_context_class">jta</property> -->
    	@Test
    	public void TestCurrentSession(){
    		Configuration configuration = new Configuration().configure();// 获得配置文件对象
    		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
    				.buildServiceRegistry();//获得服务注册对象
    		SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象
    		Session session=factory.getCurrentSession();//获取session对象
    		if (session!=null) {
    			System.out.println("Session 创建成功");
    		}else {
    			System.out.println("Session 创建失败");
    		}
    	}
    }
    
  • 相关阅读:
    在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)
    Mysql的Root密码忘记,查看或修改的解决方法
    Win7系统如何设置FTP详细过程
    该设备或资源(127.0.0.1)未设置为接受端口“16823”上的连接。
    window7防火墙无法更改某些设置,错误代码0×80070422
    访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”的解决方案
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    按状态选择链接元素
    类选择器与ID选择器的比较
    关于创建Web图像时应记住的五个要素
  • 原文地址:https://www.cnblogs.com/lonecloud/p/5714715.html
Copyright © 2011-2022 走看看