如果我们遇到一个方法里面有很多个事务,那么这个几个事务可能同时都在修改同一个数据,到最后必然报错。所以说这种情况是不允许出现的。
由于我们来开启事务的时候,都是通过以下的步骤:
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
由于我们在前面的帖子中说到,sessionFactory.openSession()方法是new一个session对象。那么要保证事务的唯一性,首先就要保证session的唯一性,由此可得,openSession这个方法可能不适合在这里用。
现在sessionFactory还有一个方法:getCurrentSession()
这个方法是获取当前线程的session,首先看当前线程中有没有session,有的话,直接拿出来用,没有的话,先创建session,然后再放到当前线程中,然后再拿出来用。
getCurrentSession方法的使用:
public void testgetSessionMethod(){
Session session=sessionFactory.getCurrentSession();
//由于我这里不需要增删改,所以不开启事务
//这里就单单获取id为1的classes
Classes classes=(Classes) session.get(Classes.class, 1L);
transaction.commit();
session.close();
}
运行之后,毫无意外的报错
可是报错说没有配置当前session。
根据下图配置好current_session的属性,把它设置成由当前线程产生
点击保存后,继续运行
然后,报错。。。
这次说:”没有开启事务,所以get方法无效“
好,那我们开启事务。
点击保存后,继续运行
然后,报错。。。
session已经关闭了,所以我们猜测可能是hibernate自动把session关闭了,所以我们把session.close()注释掉。再运行、
由上面使用getCurrentSession方法可知,在hibernate中,将session与事务绑定了,只要使用了session就一定要开启事务,这样,也保证了事务的唯一性,提高了数据的安全性,不会出现像开头中我们讨论的那种情况,多个事务同时操作一个数据。这个方法比较经典,其中的细节值得细细品味