🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 事务隔离级别 在配置文件中,可以设置事务的隔离级别. 具体是在hibernate.cfg.xml文件中`<session-factory>`标签中进行的 ~~~ <!-- 事务隔离级别 hibernate.connection.isolation = 4 1. Read uncommitted isolation 2. Read committed isolation 4. Repeatable read isolation 8. Serializable isolation --> <property name="hibernate.connection.isolation">4</property> ~~~ 设置了事务的隔离级别,那么在真正的事务管理的时候,需要考虑事务的应用场景, 也就是说我们事务控制不应该在DAO层实现,应该在service层实现,并且在service层调用多个DAO,实现一个业务逻辑 具体操作如下: Hibernate提供了三种管理session的方式: 1. Session对象的生命周期与本地线程绑定(ThreadLocal) 2. Session对象的生命周期与JTA事务绑定(分布式事务管理) 3. Hibernate委托程序来管理Session的生命周期 我们之前所使用的是第三种 ,通过程序获取一个Session对象,使用它,最后session.close(); 在实际开发中我们一般使用的是前两种: 主要介绍关于本地线程绑定Session。 步骤: 1. 需要在hibernate.cfg.xml文件配置 ~~~ <property name="hibernate.current_session_context_class">thread</property> ~~~ 2. 在获取session时不要使用openSession而是使用getCurrentSession()方法 ~~~ sessionFactory.getCurrentSession(); ~~~ ~~~ //测试session绑定到线程中 //这时每次获取到的都是一个新的session Session s1 = HibernateUtils.openSession(); Session s2 = HibernateUtils.openSession(); System.out.println(s1 == s2); Session s3 = HibernateUtils.getCurrentSession(); Session s4 = HibernateUtils.getCurrentSession(); System.out.println(s3 == s4); ~~~ # getCurrentSession使用时的注意事项 ~~~ Session session = HibernateUtils.getCurrentSession(); session.beginTransaction(); Customer c = session.get(Customer.class, 1); System.out.println(c); session.getTransaction().commit(); session.close(); ~~~ 上述代码会产生问题 ~~~ org.hibernate.SessionException: Session was already closed at org.hibernate.internal.SessionImpl.close(SessionImpl.java:411) ~~~ 原因: 使用getCurrentSession获取的与线程绑定的session对象,在事务关闭时,session对象也会close,简单说:就不需要我们再手动close