Rev 961 | Blame | Last modification | View Log | RSS feed
package ak.hostadmiral.util;
import java.util.Collection;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateUtil
{
public static final int DATABASE_VERSION = 1;
private static Configuration configuration;
private static SessionFactory sessionFactory;
private static final ThreadLocal hibernateBean = new ThreadLocal();
private static boolean validated = false;
private static void validate()
throws HibernateException, ModelException
{
synchronized(HibernateUtil.class) {
if(validated) return;
Collection versions = currentSession().find("from DatabaseVersion");
if(versions == null || versions.size() == 0)
throw new ModelException("Database structure version not found");
if(versions.size() > 1)
throw new ModelException("Too much entries in database structure version table");
int version = ((DatabaseVersion)versions.iterator().next()).getVersion();
if(version != DATABASE_VERSION)
throw new ModelException("Expected database structure version "
+ DATABASE_VERSION + ", found " + version);
validated = true;
}
}
public static Configuration getConfiguration()
throws HibernateException
{
if(configuration == null)
configuration = new Configuration();
return configuration;
}
public static SessionFactory getSessionFactory()
throws HibernateException
{
if(sessionFactory == null)
sessionFactory = getConfiguration().configure().buildSessionFactory();
return sessionFactory;
}
private static HibernateBean currentBean()
throws HibernateException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
if(hb == null) {
hb = new HibernateBean();
hb.session = getSessionFactory().openSession();
hibernateBean.set(hb);
}
return hb;
}
public static Session currentSession()
throws HibernateException
{
return currentBean().session;
}
public static void closeSession()
throws HibernateException, ModelException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
if(hb == null)
throw new ModelException("No session found for this thread");
hibernateBean.set(null);
hb.session.close();
}
public static void beginTransaction()
throws HibernateException, ModelException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
if(hb != null && hb.transaction != null)
throw new ModelException("Transaction is already open");
currentBean().transaction = currentSession().beginTransaction();
// validate database structure version
if(!validated) // just try to speed up by avoiding synchronization
validate();
}
public static boolean isTransactionOpen()
throws HibernateException, ModelException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
return (hb != null) && (hb.transaction != null);
}
public static void commitTransaction()
throws HibernateException, ModelException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
if(hb == null || hb.transaction == null)
throw new ModelException("No open transaction");
hb.transaction.commit();
hb.transaction = null;
}
public static void rollbackTransaction()
throws HibernateException, ModelException
{
HibernateBean hb = (HibernateBean)hibernateBean.get();
if(hb == null || hb.transaction == null)
throw new ModelException("No open transaction");
hb.transaction.rollback();
hb.transaction = null;
}
static class HibernateBean
{
public Session session;
public Transaction transaction;
}
}