package rainbownlp.util; import java.util.HashMap; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtil { //private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; // configures settings from hibernate.cfg.xml public static SessionFactory sessionFactory; public static Session loaderSession; public static String hibernateConfigFile = "hibernate.cfg.xml"; static Session saverSession; static{ // initialize(); } public static void initialize(){ sessionFactory = configureSessionFactory(); loaderSession = sessionFactory.openSession(); saverSession = sessionFactory.openSession(); } public static void initialize(String pConfigFile) { hibernateConfigFile = pConfigFile; initialize(); } static boolean inTransaction = false; private static SessionFactory configureSessionFactory() throws HibernateException { Configuration configuration = new Configuration(); configuration.configure(hibernateConfigFile); serviceRegistry = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); loaderSession = sessionFactory.openSession(); saverSession = sessionFactory.openSession(); return sessionFactory; } /** * save object status */ public static synchronized void save(Object _object, Session session) { try { session.getTransaction().begin(); session.saveOrUpdate(_object); session.flush(); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback(); } } public static void save(Object _object) { save(_object, loaderSession); } /** * Save the object with a newly created session. Object created by this method is not modifiable since the session pointer will be lost. * @param _object */ public static void saveWithNewSession(Object _object) { Session session = sessionFactory.openSession(); save(_object, session); session.clear(); session.close(); } public static List<?> executeReader(String hql) { return executeReader(hql, null, null, loaderSession); } public static List<?> executeReader(String hql, HashMap<String, Object> params) { return executeReader(hql, params, null, loaderSession); } public static List<?> executeReader(String hql, HashMap<String, Object> params, Integer limit) { return executeReader(hql, params, limit, loaderSession); } synchronized public static List<?> executeReader(String hql, HashMap<String, Object> params, Integer limit, Session session) { try { session.getTransaction().begin(); Query q = session.createQuery(hql); if(params!=null) for(String key :params.keySet()) { Object val = params.get(key); if(val instanceof String) q.setString(key, (String)val); else if(val!=null) q.setInteger(key, (Integer)val); } if(limit!=null) q.setMaxResults(limit); List<?> result_list = q.list(); session.getTransaction().commit(); return result_list; } catch (Exception e) { session.getTransaction().rollback(); e.printStackTrace(); return null; } } synchronized public static void executeNonReader(String hql, HashMap<String, Object> params) { if(!inTransaction) { saverSession = sessionFactory.openSession(); saverSession.beginTransaction(); } Query qr = saverSession.createQuery(hql); if (params!=null) for(String key :params.keySet()) { Object val = params.get(key); qr.setParameter(key, val); } qr.executeUpdate(); if(!inTransaction) { saverSession.flush(); saverSession.getTransaction().commit(); saverSession.close(); } } public static void executeNonReader(String hql, boolean newSession) { if(newSession){ Session session = sessionFactory.openSession(); session.beginTransaction(); Query qr = session.createQuery(hql); qr.executeUpdate(); session.flush(); session.getTransaction().commit(); session.close(); }else executeNonReader(hql); } public static void executeNonReader(String hql) { executeNonReader(hql, null); } public static void startTransaction() { saverSession = sessionFactory.openSession(); saverSession.beginTransaction(); inTransaction = true; } public static void endTransaction() { saverSession.flush(); if(!saverSession.getTransaction().wasCommitted()) saverSession.getTransaction().commit(); saverSession.close(); inTransaction = false; } public static void clearLoaderSession() { loaderSession = clearSession(loaderSession); } public static Session clearSession(Session session) { if(session!=null){ session.clear(); session.close(); } session= sessionFactory.openSession(); return session; } public static void flushTransaction() { saverSession.flush(); saverSession.getTransaction().commit(); } public static Object executeGetOneValue(String sql, HashMap<String, Object> params) { Session session = sessionFactory.openSession(); Query query = session.createQuery(sql); if (params!=null) for(String key :params.keySet()) { Object val = params.get(key); query.setParameter(key, val); } List<?> result_list = query.list(); session.clear(); session.close(); if(result_list.size()==0) return null; Object oneVal = result_list.get(0); return oneVal; } }