org.hibernate.context

Class ThreadLocalSessionContext

Implemented Interfaces:
CurrentSessionContext, Serializable

public class ThreadLocalSessionContext
extends java.lang.Object
implements CurrentSessionContext

A CurrentSessionContext impl which scopes the notion of current session by the current thread of execution. Unlike the JTA counterpart, threads do not give us a nice hook to perform any type of cleanup making it questionable for this impl to actually generate Session instances. In the interest of usability, it was decided to have this default impl actually generate a session upon first request and then clean it up after the Transaction associated with that session is committed/rolled-back. In order for ensuring that happens, the sessions generated here are unusable until after Session.beginTransaction() has been called. If close() is called on a session managed by this class, it will be automatically unbound.

Additionally, the static bind(Session) and unbind(SessionFactory) methods are provided to allow application code to explicitly control opening and closing of these sessions. This, with some from of interception, is the preferred approach. It also allows easy framework integration and one possible approach for implementing long-sessions.

The buildOrObtainSession(), isAutoCloseEnabled(), isAutoFlushEnabled(), getConnectionReleaseMode(), and buildCleanupSynch() methods are all provided to allow easy subclassing (for long-running session scenarios, for example).

Author:
Steve Ebersole

Nested Class Summary

protected static class
ThreadLocalSessionContext.CleanupSynch
JTA transaction synch used for cleanup of the internal session map.

Field Summary

protected SessionFactoryImplementor
factory

Constructor Summary

ThreadLocalSessionContext(SessionFactoryImplementor factory)

Method Summary

static void
bind(Session session)
Associates the given session with the current thread of execution.
protected ThreadLocalSessionContext.CleanupSynch
buildCleanupSynch()
protected Session
buildOrObtainSession()
Strictly provided for subclassing purposes; specifically to allow long-session support.
Session
currentSession()
protected ConnectionReleaseMode
getConnectionReleaseMode()
Mainly for subclass usage.
protected SessionFactoryImplementor
getFactory()
Getter for property 'factory'.
protected boolean
isAutoCloseEnabled()
Mainly for subclass usage.
protected boolean
isAutoFlushEnabled()
Mainly for subclass usage.
protected static Map
sessionMap()
static Session
unbind(SessionFactory factory)
Unassociate a previously bound session from the current thread of execution.
protected Session
wrap(Session session)

Field Details

factory

protected final SessionFactoryImplementor factory

Constructor Details

ThreadLocalSessionContext

public ThreadLocalSessionContext(SessionFactoryImplementor factory)

Method Details

bind

public static void bind(Session session)
Associates the given session with the current thread of execution.
Parameters:
session - The session to bind.

buildCleanupSynch

protected ThreadLocalSessionContext.CleanupSynch buildCleanupSynch()

buildOrObtainSession

protected Session buildOrObtainSession()
Strictly provided for subclassing purposes; specifically to allow long-session support.

This implementation always just opens a new session.

Returns:
the built or (re)obtained session.

currentSession

public final Session currentSession()
            throws HibernateException
Specified by:
currentSession in interface CurrentSessionContext

getConnectionReleaseMode

protected ConnectionReleaseMode getConnectionReleaseMode()
Mainly for subclass usage. This impl always returns after_transaction.
Returns:
The connection release mode for any built sessions.

getFactory

protected SessionFactoryImplementor getFactory()
Getter for property 'factory'.
Returns:
Value for property 'factory'.

isAutoCloseEnabled

protected boolean isAutoCloseEnabled()
Mainly for subclass usage. This impl always returns true.
Returns:
Whether or not the the session should be closed by transaction completion.

isAutoFlushEnabled

protected boolean isAutoFlushEnabled()
Mainly for subclass usage. This impl always returns true.
Returns:
Whether or not the the session should be flushed prior transaction completion.

sessionMap

protected static Map sessionMap()

unbind

public static Session unbind(SessionFactory factory)
Unassociate a previously bound session from the current thread of execution.
Returns:
The session which was unbound.

wrap

protected Session wrap(Session session)