package io.lumify.sql.model;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class HibernateSessionManager {
private static LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(HibernateSessionManager.class);
private SessionFactory sessionFactory;
private ThreadLocal<Session> threadLocalSession = new InheritableThreadLocal<Session>() {
@Override
protected Session initialValue() {
LOGGER.info("Opening Hibernate session");
return sessionFactory.openSession();
}
};
// this is to prevent opening a session just to clear it
private ThreadLocal<Boolean> threadLocalSessionIsOpen = new InheritableThreadLocal<Boolean>() {
@Override
protected Boolean initialValue() {
return Boolean.FALSE;
}
};
public HibernateSessionManager(SessionFactory factory) {
sessionFactory = factory;
threadLocalSession.remove();
}
public Session getSession() {
threadLocalSessionIsOpen.set(Boolean.TRUE);
return threadLocalSession.get();
}
public void clearSession() {
if (threadLocalSessionIsOpen.get()) {
Session session = threadLocalSession.get();
if (session.isOpen()) { // double checking
session.close();
LOGGER.info("Closed Hibernate session");
}
}
threadLocalSession.remove();
threadLocalSessionIsOpen.remove();
}
}