session的产生方式

如果我们遇到一个方法里面有很多个事务,那么这个几个事务可能同时都在修改同一个数据,到最后必然报错。所以说这种情况是不允许出现的。
由于我们来开启事务的时候,都是通过以下的步骤:

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就一定要开启事务,这样,也保证了事务的唯一性,提高了数据的安全性,不会出现像开头中我们讨论的那种情况,多个事务同时操作一个数据。这个方法比较经典,其中的细节值得细细品味

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值