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(); ...
Esto causará la reversión de JTA ... – dmatej
Desde JPA 2.1 puede usar em.isJoinedTransaction() – dmatej