FileDocCategorySizeDatePackage
ManagedSessionContext.javaAPI DocHibernate 3.2.53988Mon Jan 16 10:32:58 GMT 2006org.hibernate.context

ManagedSessionContext

public class ManagedSessionContext extends Object implements CurrentSessionContext
Represents a {@link CurrentSessionContext} the notion of a contextual session is managed by some external entity (generally some form of interceptor, etc). This external manager is responsible for scoping these contextual sessions appropriately binding/unbinding them here for exposure to the application through {@link SessionFactory#getCurrentSession} calls.

Basically exposes two interfaces.

  • First is the implementation of CurrentSessionContext which is then used by the {@link SessionFactory#getCurrentSession()} calls. This portion is instance-based specific to the session factory owning the given instance of this impl (there will be one instance of this per each session factory using this strategy).
  • Second is the externally facing methods {@link #hasBind}, {@link #bind}, and {@link #unbind} used by the external thing to manage exposure of the current session it is scoping. This portion is static to allow easy reference from that external thing.
The underlying storage of the current sessions here is a static {@link ThreadLocal}-based map where the sessions are keyed by the the owning session factory.
author
Steve Ebersole

Fields Summary
private static final ThreadLocal
context
private final org.hibernate.engine.SessionFactoryImplementor
factory
Constructors Summary
public ManagedSessionContext(org.hibernate.engine.SessionFactoryImplementor factory)


	   
		this.factory = factory;
	
Methods Summary
public static org.hibernate.classic.Sessionbind(org.hibernate.classic.Session session)
Binds the given session to the current context for its session factory.

param
session The session to be bound.
return
Any previously bound session (should be null in most cases).

		return ( Session ) sessionMap( true ).put( session.getSessionFactory(), session );
	
public org.hibernate.classic.SessioncurrentSession()

see
CurrentSessionContext#currentSession

		Session current = existingSession( factory );
		if ( current == null ) {
			throw new HibernateException( "No session currently bound to execution context" );
		}
		return current;
	
private static synchronized voiddoCleanup()

		Map sessionMap = sessionMap( false );
		if ( sessionMap != null ) {
			if ( sessionMap.isEmpty() ) {
				context.set( null );
			}
		}
	
private static org.hibernate.classic.SessionexistingSession(org.hibernate.SessionFactory factory)

		Map sessionMap = sessionMap();
		if ( sessionMap == null ) {
			return null;
		}
		else {
			return ( Session ) sessionMap.get( factory );
		}
	
public static booleanhasBind(org.hibernate.SessionFactory factory)
Check to see if there is already a session associated with the current thread for the given session factory.

param
factory The factory against which to check for a given session within the current thread.
return
True if there is currently a session bound.

		return existingSession( factory ) != null;
	
protected static java.util.MapsessionMap()

		return sessionMap( false );
	
private static synchronized java.util.MapsessionMap(boolean createMap)

		Map sessionMap = ( Map ) context.get();
		if ( sessionMap == null && createMap ) {
			sessionMap = new HashMap();
			context.set( sessionMap );
		}
		return sessionMap;
	
public static org.hibernate.classic.Sessionunbind(org.hibernate.SessionFactory factory)
Unbinds the session (if one) current associated with the context for the given session.

param
factory The factory for which to unbind the current session.
return
The bound session if one, else null.

		Session existing = null;
		Map sessionMap = sessionMap();
		if ( sessionMap != null ) {
			existing = ( Session ) sessionMap.remove( factory );
			doCleanup();
		}
		return existing;