001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.hibernate.session;
023:
024: import org.hibernate.Session;
025: import org.hibernate.HibernateException;
026: import org.hibernate.SessionFactory;
027:
028: import javax.naming.InitialContext;
029: import javax.naming.NamingException;
030:
031: /**
032: * Maintains and exposes, for app usage, the current context bound Hibernate Session.
033: * Application code need only deal with the {@link #getSession(java.lang.String)}
034: * as the means to retreive the {@link org.hibernate.Session} associated with
035: * the current context.
036: *
037: * @author <a href="mailto:steve@hibernate.org">Steve Ebersole</a>
038: * @version $Revision: 57193 $
039: *
040: * @deprecated Direct use of the new {@link org.hibernate.SessionFactory#getCurrentSession()}
041: * method is the preferred approach to managing "transaction contextual sessions".
042: */
043: public class HibernateContext {
044: /**
045: * Retreives an "unmanaged" session against the same underlying jdbc connnection as the session
046: * currently bound to the current context for the given JNDI name. This is simply a convenience
047: * method for SessionFactory.openSession({@link #getSession}.connection()). Unmanaged here means that
048: * the returned session is not controlled by the code managing the actually bound session; callers
049: * are required to cleanup these sessions manually using {@link #releaseUnmanagedSession}.
050: *
051: * @param name The "name" of the {@link org.hibernate.SessionFactory}
052: * for which an unmanaged session is requested.
053: * @return An unmanaged session.
054: * @throws HibernateException If an error occurs opening the new Session.
055: * @throws IllegalStateException If unable to locate a managed Session for the current context.
056: *
057: * @deprecated Given a SessionFactory, sf (usually obtained from JNDI), this method is equivalent to
058: * <pre>sf.openSession( sf.getCurrentSession().connection() )</pre>
059: */
060: public static Session getUnmanagedSession(String name)
061: throws HibernateException, IllegalStateException {
062: SessionFactory sf = locateSessionFactory(name);
063: return sf.openSession(sf.getCurrentSession().connection());
064: }
065:
066: /**
067: * Method to release a previously obtained unmanaged session.
068: *
069: * @param unmanagedSession The unmanaged Session to release.
070: * @throws HibernateException If an error occurs releasing the unmanaged Session.
071: *
072: * @deprecated See {@link #getUnmanagedSession(String)}
073: */
074: public static void releaseUnmanagedSession(Session unmanagedSession)
075: throws HibernateException {
076: unmanagedSession.close();
077: }
078:
079: /**
080: * Retreives the session currently bound to the current context.
081: *
082: * @param name The "name" of the {@link org.hibernate.SessionFactory}
083: * for which a session is requested.
084: * @return The current session.
085: *
086: * @deprecated Given a SessionFactory, sf (usually obtained from JNDI), this method is equivalent to
087: * <pre>sf.getCurrentSession()</pre>.
088: *
089: * @see org.hibernate.SessionFactory#getCurrentSession()
090: */
091: public static Session getSession(String name) {
092: return locateSessionFactory(name).getCurrentSession();
093: }
094:
095: private static SessionFactory locateSessionFactory(String name)
096: throws HibernateException {
097: InitialContext context = null;
098: try {
099: context = new InitialContext();
100: final SessionFactory factory = (SessionFactory) context
101: .lookup(name);
102: return factory;
103: } catch (NamingException e) {
104: throw new HibernateException(
105: "Unable to locate SessionFactory in JNDI under name ["
106: + name + "]", e);
107: } finally {
108: release(context);
109: }
110: }
111:
112: private static void release(InitialContext ctx) {
113: if (ctx != null) {
114: try {
115: ctx.close();
116: } catch (Throwable ignore) {
117: // ignore
118: }
119: }
120: }
121: }
|