    001// Copyright 2007, 2008 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007//     http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.hibernate.internal;
    016
    017import org.apache.tapestry5.hibernate.HibernateSessionManager;
    018import org.apache.tapestry5.hibernate.HibernateSessionSource;
    019import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
    020import org.hibernate.Session;
    021import org.hibernate.Transaction;
    022
    023public class HibernateSessionManagerImpl implements HibernateSessionManager, ThreadCleanupListener
    024{
    025    private final Session session;
    026
    027    private Transaction transaction;
    028
    029    public HibernateSessionManagerImpl(HibernateSessionSource source)
    030    {
    031        session = source.create();
    032
    033        startNewTransaction();
    034    }
    035
    036    private void startNewTransaction()
    037    {
    038        transaction = session.beginTransaction();
    039    }
    040
    041    @Override
    042    public void abort()
    043    {
    044        transaction.rollback();
    045        startNewTransaction();
    046    }
    047
    048    @Override
    049    public void commit()
    050    {
    051        transaction.commit();
    052        startNewTransaction();
    053    }
    054
    055    @Override
    056    public Session getSession()
    057    {
    058        return session;
    059    }
    060
    061    /**
    062     * Rollsback the transaction at the end of the request, then closes the session. This means that any uncommitted
    063     * changes are lost; code should inject the HSM and invoke {@link #commit()} after making any changes, if they
    064     * should persist.
    065     */
    066    @Override
    067    public void threadDidCleanup()
    068    {
    069        transaction.rollback();
    070
    071        session.close();
    072    }
    073}