package com.rzg.zombieland.server.persistencia;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.rzg.zombieland.comunes.misc.Log;
import com.rzg.zombieland.server.meta.ResultadoJugador;
import com.rzg.zombieland.server.sesion.Jugador;
/**
* Maneja una sesi�n de Hibernate.
* @author nicolas
*
*/
public class HibernateSingleton {
private final SessionFactory sessionFactory;
private static HibernateSingleton instancia;
private static boolean test = false;
/**
* Inicializa el singleton con un nombre de DB particular.
* @param nombreDB
*/
private HibernateSingleton(String nombreDB) {
sessionFactory = new Configuration()
.setProperty("hibernate.connection.url", (test ? "jdbc:hsqldb:mem:" : "jdbc:hsqldb:file:") + nombreDB)
.setProperty("hibernate.hbm2ddl.auto", test ? "create" : "update")
.setProperty("driver_class", "org.hsqldb.jdbcDriver")
.setProperty("hibernate.connection.username", "sa")
.setProperty("hibernate.connection.password", "cambiar")
.setProperty("hibernate.connection.pool_size", "1")
.setProperty("hibernate.connection.dialect", "org.hibernate.dialect.HSQLDialect")
.setProperty("current_session_context_class", "thread")
.setProperty("show_sql", "false")
.setProperty("cache.provider_class", "org.hibernate.cache.NoCacheProvider")
.addAnnotatedClass(ResultadoJugador.class)
.addAnnotatedClass(Jugador.class)
.buildSessionFactory();
}
/**
* Pone a la base de datos en modo �test�. Debe llamarse antes del primer getInstancia().
*/
public static void setTest() {
test = true;
}
/**
* @return la instancia de HibernateSingleton.
*/
public synchronized static HibernateSingleton getInstancia() {
if (instancia == null) {
if (test)
instancia = new HibernateSingleton("db/test.db");
else
instancia = new HibernateSingleton("db/produccion.db");
}
return instancia;
}
/**
* Abre una sesi�n de Hibernate. �No olvides cerrarla!
* @return la sesi�n.
*/
public Session openSession() {
return sessionFactory.openSession();
}
/**
* Cierra la conexi�n con la DB. Es necesario para que se pueda cerrar el programa.
*/
public static void cerrarConexion() {
getInstancia().sessionFactory.close();
instancia = null;
}
/**
* "Calienta" la base de datos con una consulta para no tener que esperar que se verifiquen
* todas las tablas con la primera consulta.
*/
public static void prepararDB() {
Log.info("Preparando base de datos");
Session session = getInstancia().sessionFactory.openSession();
session.createCriteria(Jugador.class);
session.get(Jugador.class, 1);
session.close();
Log.info("Base de datos lista");
}
}