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