• 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 创建失败");
    		}
    	}
    }
    
  • 相关阅读:
    html页面自动运行php文件
    在数据库原有字段后增加新内容
    mysql判断字段不等于空
    php中的日期加减
    js验证只能输入中文
    session_start()关于Cannot send session cache limiter headers already sent错误解决方法
    php记录前一页面url
    打印功能
    js验证email
    用php获取本周,上周,本月,上月,本季度日期
  • 原文地址:https://www.cnblogs.com/lonecloud/p/5714715.html
Copyright © 2020-2023  润新知