2011-11-04 14 views
5

Tengo una clase de utilidad como se muestra a continuación. Quiero poder utilizar esta clase con unidades de persistencia RESOURCE_LOCAL o JTA. Si cambio persistence.xml de JTA a RESOURCE_LOCAL, no debería tener que cambiar el código.¿Cómo puedo saber si mi EntityManager usa el origen de datos JTA o RESOURCE_LOCAL?

Intenté usar EntityManager.getTransaction() para ver si hay una transacción activa, pero la llamada a getTransaction() arroja una excepción si se está utilizando JTA. Podría rodear la llamada para obtener Transaction() con un try/catch, pero no quiero recurrir al manejo de excepciones para esto. EntityManager.getProperties() no muestra nada que indique JTA o RESOURCE_LOCAL

Necesito alguna forma de decir qué tipo de unidad de persistencia usa EntityManager (o EntityManagerFactory) en el código siguiente.

public class CredentialsUtil { 

public static final String VGBD_PU = "VGDBpu"; 
static Logger logger = Logger.getLogger(CredentialsUtilStatic.class); 
static EntityManagerFactory emf = Persistence.createEntityManagerFactory(VGBD_PU); 
public static final String sharedKey="pgpsympwd"; 



public static String getPassword(String username) { 

    String selectStr = "select pgp_sym_decrypt(pgpsympassword, '" + sharedKey + "') from credentials where username='" + username + "'"; 

    EntityManager em =null; 
    String password = ""; 

    try { 
     em = emf.createEntityManager(); 

     java.util.Map<java.lang.String,java.lang.Object> propMap = em.getProperties(); 
     logger.info(propMap.keySet().size() + " properties"); 

     for (String key : propMap.keySet()) 
      logger.info(key + ", " + propMap.get(key)); 

     EntityTransaction tx = em.getTransaction(); ... 

Respuesta

2

Usted puede intentar algo como esto, que se basa en las diferentes APIs para las transacciones de los tipos de administradores de dos entidades:

public boolean isResourceLocal(EntityManager em) { 

    try { 
    EntityTransaction tx = em.getTransaction(); 
    return true; 
    } catch (IllegalStateException ex) { 
    return false; 
    } 

} 
+0

Esto causará la reversión de JTA ... – dmatej

+0

Desde JPA 2.1 puede usar em.isJoinedTransaction() – dmatej

0

Cuando se llama a getTransaction() en un gestor de la entidad JTA, el proveedor de persistencia tiros un IllegalStateException.

Ver javadoc para más detalles:

EntityTransaction GetTransaction()

devolver el objeto EntityTransaction a nivel de recursos. La instancia de EntityTransaction se puede usar en serie para comenzar y confirmar transacciones múltiples.

Devuelve: ejemplo EntityTransaction

Lanza: IllegalStateException - si se invoca en un gestor de la entidad JTA

Cuando se utiliza EclipseLink esto provoca un retroceso en la transacción actual:

public EntityTransaction getTransaction() { 
    try { 
     return ((TransactionWrapper)this.transaction).getTransaction(); 
    } catch (RuntimeException e) { 
     setRollbackOnly(); 
     throw e; 
    } 
} 
Cuestiones relacionadas