1.hibernate执行过程:
1)应用程序先调用Configuration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactory对象
2)利用SessionFactory对象得到session对象,两种方式:getCurrentSession与 openSession()。
区别:
1)getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
2) getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭(session.close)。
3) openSession()打开的是新的session,getCurrentSession会先从上下文找,有session就拿过来用,没有就创造新的session
3)session对象开启事务,得到一个事务对象:
Transaction tx= session.beginTransaction();
4)利用session对象的方法get load save delete操作pojo实体类
5)事务提交+session.close()+sessionfactory.close()
2.Spring中配置Hibernate事务的核心:
1.配置SessionFactory
2.配置事务容器
3.配置事务规则
4.配置事务入口
3.spring管理hibernate事务(注解实现):
其余实现方式:https://blog.csdn.net/zhangqindabendan/article/details/68961389
1)spring得到hibernate的SessionFactory的控制权。(spring配置文件中)2)然后,在配置文件中写入下面语句,打开注解功能(配置事务容器)3)事务规则与事务接口:
@Transactional对类或者方法进行标记,如果标记到类上,那么此类中所有方法都进行开启事务以及事务回滚处理,在类中定义Transactional的时候,它有propagation、rollbackFor、noRollbackFor等属性,此属性是用来定义事务规则,而定义到哪这个就是事务入口。
eg:
service实现类上加上@Transactional,(事务规则使用默认的)。
dao层实现类上只需要得到session,并且利用session的方法操作pojo实体类了。不需要开启事务以及提交事务或者回滚事务了。
service实现类:
dao层实现类:
总结:使用spring来管理事务非常方便,可以将hibernate原来的复杂步骤简单化!我们来过一遍spring管理的hibernate事务的过程,再与上面讲的hibernate管理事务流程对比下!:
1)spring取得sessionFactory管理权
2)通过sessionFactory.getCurrentSession得到session。这样会自动关闭session。
3)在方法上加上@Transactional。这样方法在执行前会自动打开事务,在session操作完pojo实体类后,成功则会自动提交事务,失败则会自动回滚事务。
4)(关闭session,由于用的sessionFactory.getCurrentSession,会自动关闭)
5)(关闭sessionFactory,由spring自动管理)