您的位置:首页 > 其它

Hibernate中的Session管理和对话实现

2014-01-27 14:55 162 查看

1 管理Session对象

Session对象的管理方式:

应用程序序自主管理Session;
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. 原子性。

对话的实现方式有三种:

整个对话对应一个事务,并且与一个Session对象对应。1:1:1

使用游离对象:一个对话包括多个短事务,并且每个短事务对应一个单独的Session对象。事务之间通过游离对象传递业务数据。1:n:n
使用手工缓存模式下的Session对象:一个对话包含多个短事务,并且整个对话对应一个Session对象。1:n:1
三种实现对话方式比较如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate Session 对话