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
原文地址:https://www.cnblogs.com/sunyanblog/p/12724761.html