hibernate的session的产生方式,区别在哪里?

hibernate的session的产生方式,区别在哪里?如何产生?

session的产生方式有哪些,并且为什么要分这个?

产生流程:



1、方式一

sessionFactory.opensession():一般的crud操作我们用的是这个操作,只有增删改才用到事务,查询不需要。

//	session的第一种产生方式:opensession():每一次都产生一个新对象
	@Test
	public void sessio_opensession(){
		Session session=sessionfactory.openSession();
		Transaction transaction=session.beginTransaction();
		transaction.commit();
		session.close();
	}

2.方式二

sessionFactory.getCurrentSession():这个方式用的理由如下;

理由:如果有多个拥有session的方法互相调用,这个时候就存在多个session对象和多个事务了。保证不了crud操作只在一个session对象和事务中操作?这个时候寄引用到第二种方式了。

//	session的第二种产生方式:getCurrentSession():
//	每次都要在localThread中判断是否有这个对象,有的话直接拿出来用。
//	没有的话,新建一个,与Factory绑定放入LocalThread中。
//	这种方式下的crud操作,全都必须在事务下操作,(并且事务和session是绑定在一起的。)
	@Test
	public void sessionfac_crate(){
		Session session=sessionfactory.getCurrentSession();
		Transaction transaction=session.beginTransaction();
		session.load(Classes.class, 1L);
		transaction.commit();
//		session.close();//事务已提交就自动关闭了,就不用写这个关闭了。不然就会出连接已关闭的错
	}

sessionFactory.getCurrySession为什么这种方式下的事务会和session绑定在一起?理由?这个问题在网上的争议都挺大的。没有准确的答案

总结了两点:

session.getCurrentSession的用法

  1、在hibernate的配置文件中必须加上这个才能用第二种方式:

        <propertyname="current_session_context_class">thread</property>

  2、不需要写session.close方法,在事务提交的时候会自动关闭(hibernate内部完成)

  3crud都需要事务

      1、因为是一个线程,所以在整个方法中有一个session和一个事务

      2、保证了整个业务操作的安全性


网上针对事务为什么绑定在一起的说法:

getCurrentSession得到的session是和事务绑定的session,所以:
1,要用getCurrentSession生产的session,就必须有事务环境,意思就是你必须在调用session方法之前,session.beginTransaction();就算你只是get或者query


2,在事务提交之后,即session.getTransaction().commit()之后,session自动关闭,所以你用getCurrentSession,只需要commit事务,不要去调用session.close()。

3,你用的是ssh,spring为hibernate的current_session_context_class配置了一个SpringSessionContext来帮你管理getCurrentSession中的session,所以,你在OpenSessionInview的时候,spring就自动的帮你打开了session——>你在执行用AOP包装的事务的时候,事务就开启了——>执行你的业务方法——>提交事务(注意,hibernate管理的getCurrentSession在提交事务的时候才会关闭ession,而spring提供的这个SpringSessionContext不会)——>opensessioninview关闭session。
从上面的执行流程可以看出,你在SSH集成的时候,如果用的是getCurrentSession的集成方式,就不能设置hibernate的current_session_context_class为thread,而应该空着,让spring帮你。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值