package org.compass.gps.device.jpa; import javax.persistence.EntityTransaction; import javax.persistence.PersistenceException; /** * The default {@link EntityManagerWrapper} implementation. Works well both in * JTA and Resource Local JPA transactions. * * @author kimchy */ public class DefaultEntityManagerWrapper extends AbstractEntityManagerWrapper { private boolean isJta; private EntityTransaction transaction; @Override protected void beginTransaction() throws PersistenceException { try { // getTransaction will throw IllegalStateException if it is witin JTA transaction = entityManager.getTransaction(); isJta = false; try { transaction.begin(); } catch (Exception e) { transaction = null; } } catch (IllegalStateException e) { // thrown when we are in a JTA transaction isJta = true; entityManager.joinTransaction(); } } @Override protected void commitTransaction() throws PersistenceException { if (transaction == null) { return; } try { transaction.commit(); } finally { transaction = null; } } @Override protected void rollbackTransaction() throws PersistenceException { if (transaction == null) { return; } try { transaction.rollback(); } finally { transaction = null; } } @Override protected boolean shouldCloseEntityManager() { return !isJta; } }