Hibernate Contextual sessions

Hibernate Contextual sessions


Contextual sessions:上下文session, 一个session只在一个给点的上下文中有效。

从3.0.1开始,Hibernate添加了SessionFactory.getCurrentSession()方法获取current session。
从3.1开始,current的定义由org.hibernate.context.spi.CurrentSessionContext的实现定义。在配置文件中,通过hibernate.current_session_context_class指定CurrentSessionContext的实现类。没有进行指定时,默认使用JTA实现。

Hibernate提供了三个实现:
org.hibernate.context.internal.JTASessionContext: current sessions被一个JTA事务跟踪和限定范围。Hibernate旧版本都使用这个实现。
org.hibernate.context.internal.ThreadLocalSessionContext: current sessions由执行线程跟踪。该实现下,调用getCurrentSession方法,会返回一个session实例。在使用通过getCurrentSession获取的session之前,必须调用session.beginTransaction()方法或者通过session获取Transaction后,调用begin()方法将session绑定到上下文,否则使用该session进行CRUD时抛出异常,此时再次调用getCurrentSession方法获取的session和前面获取的session在同一个事务上下文中。调用commit()或者rollback()方法后,session将和上下文解除绑定并被关闭,再使用这个session进行CRUD时就会抛出异常。
org.hibernate.context.internal.ManagedSessionContext: current sessions由执行线程跟踪。但是,用户必须负责调用ManagedSessionContext类的静态方法绑定和解除绑定一个Session实例。ManagedSessionContext不会open, flush, 或者close一个Session。该实现下,调用getCurrentSession方法,不会返回一个session实例。用户必须自己open一个session,再绑定到ManagedSessionContext中,使用完成后,再手工解除绑定。调用commit()或者rollback()方法后,session不会上下文解除绑定,也不会被关闭。




你可能感兴趣的:(Hibernate)