Hibernate中的Session管理和对话实现

1 管理Session对象

Session对象的管理方式:

  1. 应用程序序自主管理Session;
  2. Hibernate管理Session。

1.1 应用程序自主管理Session

应用程序自主管理Session对象的生命周期时,何时创建Session、何时清理缓存及何时关闭Session都有程序负责。

缺点:1)代码重复;2)多个类共享同一个Session对象比较麻烦。

1.2 Hibernate管理Session

Hibernate管理Session的三种方式:

  • Session对象的生命周期与本地线程绑定(Hibernate负责将Session与本地线程绑定)
  • Session对象的生命周期与JTA事务绑定
  • Hibernate 委托程序管理Session对象的生命周期(也就是说,应用程序自主管理Session对象时,借助于Hibernate将Session与本地线程绑定)

在Hibernate的配置文件Hibernate.cfg.xml中设置session的管理方式:

<property name="current_session_context_class">thread</property> //thread也可以换成jta或managed,分别对应三种管理方式;

  1 Session对象的生命周期与本地线程绑定

  • 创建Session:当一个线程调用SessionFactory的getCurrentSession()方法,而且此时没有Session与当前线程绑定时,Hibernate自动创建Session对象
  • 关闭Session:当一个线程提交或撤销事务后,Hibernate自动关闭Session对象。

    2 Session对象生命周期与JTA事务绑定

  • 创建Session:当一个线程调用SessionFactory的getCurrentSession()方法,而且此时没有Session与当前JTA事务绑定时,Hibernate自动创建Session对象
  • 关闭Session:当一个线程提交或撤销JTA事务后,Hibernate自动关闭Session对象。

Session对象与本地线程和与JTA事务绑定的区别:

前者是先有Session对象,然后由Session对象的beginTransaction()方法声明一个事务;而后者是先通过UserTransaction接口声明开始一个JTA事务,然后出现与该JTA绑定的Session对象。

    3  Hibernate委托程序管理Session对象

org.hibernate.context.ManagedSessionContext的静态方法:

  • bind(Session session):把Session与当前线程绑定。
  • unbind(SessionFactory factory):解除Session对象与当前线程的绑定。
  • hasBind(SessionFactory factory):判断是否存在与当前线程绑定的Session对象。

应用程序可以利用上面提供的方法来将session对象与当前线程绑定。

  • 创建Session :Session对象由程序决定何时创建,当程序创建Session对象后或者声明开始一个事务前,利用bind()方法将Session与当前线程绑定。
  • 关闭Sesssion:程序决定何时关闭一个Session对象。当程序提交一个事务之前,调用unbind()方法,解除Session对象与当前线程的绑定。

2 实现对话

对话:包含了用户思考时间的长工作单元。会话必须满足:1. 数据一致性,即防止并发问题。2. 原子性。

对话的实现方式有三种:

  1. 整个对话对应一个事务,并且与一个Session对象对应。1:1:1
  2. 使用游离对象:一个对话包括多个短事务,并且每个短事务对应一个单独的Session对象。事务之间通过游离对象传递业务数据。1:n:n
  3. 使用手工缓存模式下的Session对象:一个对话包含多个短事务,并且整个对话对应一个Session对象。1:n:1

三种实现对话方式比较如下图所示:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值