package org.telosys.starterkits.strutsjpa;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.metamodel.EntityType;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
/**
* EntityManagerHelper
* @author slabbe
*/
public class EntityManagerHelper {
private static final String JPA_TEST = "jpaderby";
private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory(JPA_TEST);
private static final ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
private static final Logger LOG = LoggerFactory.getLogger(EntityManagerHelper.class);
/**
* Get EntityManager
* @return EntityManager
*/
public static EntityManager getEntityManager() {
EntityManager manager = threadLocal.get();
if (manager == null || manager.isOpen() == false) {
manager = emf.createEntityManager();
threadLocal.set(manager);
}
return manager;
}
/**
* Get known Entities list
* @return Entities names list
*/
public static List<String> getEntityList() {
List<String> liste = new ArrayList<String>(emf.getMetamodel().getEntities().size());
for (EntityType<?> entite : emf.getMetamodel().getEntities()) {
liste.add(entite.getJavaType().getSimpleName().toLowerCase());
}
return liste;
}
/**
* Initialize EntityManager
*/
public static void initializeEntityManager() {
getEntityManager();
}
/**
* Close EntityManager
*/
public static void closeEntityManager() {
final EntityManager em = threadLocal.get();
threadLocal.set(null);
closeEm(em);
}
/**
* Commit and Close EntityManager
*/
public static void commitAndCloseEntityManager() {
final EntityManager em = threadLocal.get();
try {
if (em != null) {
em.getTransaction().commit();
}
} finally {
threadLocal.set(null);
closeEm(em);
}
}
/**
* Start tx
*/
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
/**
* Commit
*/
public static void commit() {
getEntityManager().getTransaction().commit();
}
/**
* RollBack
*/
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
/**
* Set rollback only
*/
public static void setRollbackOnly() {
getEntityManager().getTransaction().setRollbackOnly();
}
/**
* Check if EntotyManager closed
* @return true or false
*/
public static boolean isCloseEntityManager() {
EntityManager manager = threadLocal.get();
if (manager == null || manager.isOpen() == false) {
return true;
} else {
return false;
}
}
/**
* Close EntityManager
* @param em EntityManager
*/
private static void closeEm(final EntityManager em) {
try {
if (em != null) {
em.close();
}
} catch(Exception ex) {
LOG.error("Close Em error", ex);
}
}
}