package org.jboss.hibernateUniversity.criteria.tools;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
/**
* @author Emmanuel Bernard
*/
@Singleton
public class TransactionManager {
@Inject
private EntityManagerFactory factory;
private ThreadLocal<EntityManager> emHolder = new ThreadLocal<EntityManager>();
public void begin() {
EntityManager entityManager = this.emHolder.get();
if ( entityManager == null ) {
entityManager = factory.createEntityManager();
entityManager.getTransaction().begin();
emHolder.set( entityManager );
}
else {
throw new RuntimeException( "start a tx on an already started EM");
}
}
@Produces @Dependent
public EntityManager getEntityManager() {
EntityManager entityManager = this.emHolder.get();
if ( entityManager == null ) {
throw new RuntimeException( "EM not started");
}
else {
return entityManager;
}
}
public void commit() {
EntityManager entityManager = this.emHolder.get();
if ( entityManager == null ) {
throw new RuntimeException( "commit a tx on a null EM");
}
else {
entityManager.getTransaction().commit();
entityManager.close();
emHolder.set( null );
}
}
public void rollback() {
EntityManager entityManager = this.emHolder.get();
if ( entityManager == null ) {
throw new RuntimeException( "rollback a tx on a null EM");
}
else {
entityManager.getTransaction().rollback();
entityManager.close();
emHolder.set( null );
}
}
}