package org.cryptocoinpartners.util; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.FlushModeType; import javax.persistence.Persistence; import javax.persistence.Query; import javax.persistence.TypedQuery; import org.cryptocoinpartners.schema.EntityBase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PersistUtilHelper { private static EntityManagerFactory emf; private static final ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>(); private static ConcurrentHashMap<String, EntityManager> entityManagers = new ConcurrentHashMap<String, EntityManager>(); protected static Logger log = LoggerFactory.getLogger("org.cryptocoinpartners.persistUtilHelper"); PersistUtilHelper(Map<String, String> properties) { emf = Persistence.createEntityManagerFactory("org.cryptocoinpartners.schema", properties); } public static EntityManagerFactory getEntityManagerFactory() { return emf; } public static EntityManager getEntityManager() { EntityManager em = threadLocal.get(); if (em == null || !em.isOpen()) { em = emf.createEntityManager(); entityManagers.put(em.toString(), em); threadLocal.set(em); } return em; } public static <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass) { //getEntityManager().clear(); Map<String, Object> myproperties = getEntityManager().getProperties(); Map<String, Object> props = new HashMap<String, Object>(); // props.put("javax.persistence.cache.retrieveMode", "BYPASS"); //getEntityManager().setProperty("javax.persistence.cache.storeMode", "BYPASS"); // getEntityManager().setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS); return getEntityManager().createQuery(qlString, resultClass); } public static Query createQuery(String qlString) { return getEntityManager().createQuery(qlString); } public static void closeEntityManager() { EntityManager em = threadLocal.get(); if (em != null) { entityManagers.remove(em.toString()); try { em.close(); } catch (Exception | Error e) { log.error("Threw a Execpton or Error, full stack trace follows:", e); e.printStackTrace(); } threadLocal.set(null); } } public static void clearEntityManager() { EntityManager em = threadLocal.get(); if (em != null) { em.clear(); } } public static void closeEntityManagerFactory() { emf.close(); // emf = null; } public static void beginTransaction() { getEntityManager().getTransaction().begin(); } public static void rollback() { getEntityManager().getTransaction().rollback(); } public static void commit() { getEntityManager().getTransaction().commit(); } public static void detach(Object entity) { Iterator it = entityManagers.values().iterator(); while (it.hasNext()) { EntityManager em = (EntityManager) it.next(); if (em != null || em.isOpen()) em.detach(entity); } } public static void evict(Object entity) { Iterator it = entityManagers.values().iterator(); while (it.hasNext()) { EntityManager em = (EntityManager) it.next(); if (em != null || em.isOpen()) em.getEntityManagerFactory().getCache().evict(entity.getClass(), ((EntityBase) entity).getId()); //em.getEntityManagerFactory().createEntityManager(SynchronizationType.) } } public static void merge(Object entity) { Iterator it = entityManagers.values().iterator(); while (it.hasNext()) { EntityManager em = (EntityManager) it.next(); if (em != null || em.isOpen()) if (em.find(entity.getClass(), ((EntityBase) entity).getId()) != null) em.merge(entity); } } public static void refresh(Object entity) { Iterator it = entityManagers.values().iterator(); Object parent = null; while (it.hasNext()) { EntityManager em = (EntityManager) it.next(); Object mergedEntity = null; Object rootEntity = null; Map<String, Object> props = new HashMap<String, Object>(); if (em != null || em.isOpen()) em.refresh(entity); parent = em.find(entity.getClass(), ((EntityBase) entity).getId(), props); rootEntity = em.getReference(entity.getClass(), ((EntityBase) entity).getId()); //rootEntity = em.find(entity.getClass(), ((EntityBase) entity).getId()); //if (em.find(entity.getClass(), ((EntityBase) entity).getId()) != null) ///em.re em.refresh(rootEntity); em.persist(rootEntity); //em.merge(rootEntity); //em.flush(); //em.refresh(mergedEntity); } } public static void find(Object entity) { Iterator it = entityManagers.values().iterator(); while (it.hasNext()) { EntityManager em = (EntityManager) it.next(); FlushModeType flushMode; Object rootEntity = null; Map<String, Object> props = new HashMap<String, Object>(); Object parent; //Object Object; if (em != null || em.isOpen()) parent = em.find(entity.getClass(), ((EntityBase) entity).getId(), props); rootEntity = em.getReference(entity.getClass(), ((EntityBase) entity).getId()); { em.refresh(rootEntity); em.refresh(entity); em.detach(rootEntity); } //em. //em.refresh(rootEntity); //em.getEntityManagerFactory().unwrap(cls). // flushMode = em.getFlushMode(); //em.setFlushMode(FlushModeType.) //if (em.find(entity.getClass(), ((EntityBase) entity).getId()) != null) // em.merge(entity); } } public static boolean isActive() { return getEntityManager().getTransaction().isActive(); } public static boolean isOpen() { return emf.isOpen(); } public static void evictAll() { emf.getCache().evictAll(); } public static void reset() { emf = null; // TODO Auto-generated method stub } }