• Hibernate事务操作


    Hibernate事务操作

    事务相关概念

    1 什么是事务

    2 事务特性

    3 不考虑隔离性产生问题

    (1)脏读

    (2)不可重复读

    (3)虚读

    4 设置事务隔离级别

    (1)mysql默认隔离级别 repeatable read

    Hibernate事务代码规范写法

    1 代码结构

    try {
      开启事务
      提交事务
    } catch() {
      回滚事务
    } finally {
      关闭
    }
    
    	@Test
    	public void testTx() {
    		SessionFactory sessionFactory = null;
    		Session session = null;
    		Transaction transaction = null;	
    		try {
    			sessionFactory = HibernateUtils.getSessionFactory();
    			session = sessionFactory.openSession();
    
    			// 开启事务
    			transaction = session.beginTransaction();
    
    			// 添加
    			User user = new User();
    			user.setUsername("张三");
    			user.setPassword("456");
    			user.setAddress("长沙");
    
    			session.save(user);
    
    			// 提交事务
    			transaction.commit();
    		} catch (Exception e) {
    			e.printStackTrace();
    			// 回滚事务
    			transaction.rollback();
    		} finally {
    			// 关闭资源
    			session.close();
    			sessionFactory.close();
    		}
    	}
    

    在项目中SessionFactory不需要关闭,工具类中,静态代码块只执行一次。此处为单元测试。

    Hibernate绑定session

    1 session类似于jdbc的connection,之前web阶段学过 ThreadLocal

    2 帮实现与本地线程绑定session

    3 获取与本地线程session

    (1)在hibernate核心配置文件中配置

    <property name="hibernate.current_session_context_class">thread</property>
    

    (2)调用sessionFactory里面的方法得到

    	//提供返回与本地线程绑定的方法	
    	public static Session getSessionObject() {
    		return sessionFactory.getCurrentSession();
    	}
    
    		Session session = null;
    		Transaction transaction = null;	
    		try {
    			session = HibernateUtils.getSessionObject();
    			// 开启事务
    			transaction = session.beginTransaction();
    
    			// 添加
    			User user = new User();
    			user.setUsername("李四");
    			user.setPassword("111");
    			user.setAddress("长沙");
    
    			session.save(user);
    
    			// 提交事务
    			transaction.commit();
    		} catch (Exception e) {
    			e.printStackTrace();
    			// 回滚事务
    			transaction.rollback();
    		} finally {
    			// 关闭资源
    //			session.close();
    //			sessionFactory.close();
    		}
    

    4 获取与本地线程绑定session时候,关闭session报错,不需要手动关闭了

    org.hibernate.SessionException: Session was already closed
    
  • 相关阅读:
    【转】浅谈Node.js单线程模型
    进程
    网络编程:tcp、udp、socket、struct、socketserver
    Python基础练习
    面向对象:其他双下方法
    isinstance、issubclass、反射
    面向对象:__getitem__、__setitem__、__delitem__
    面向对象:classmethod、staticmethod、property
    面向对象:继承、多态、封装
    异常处理
  • 原文地址:https://www.cnblogs.com/sunyanblog/p/12724761.html
Copyright © 2020-2023  润新知