Mam klasę narzędzia, jak pokazano poniżej. Chcę móc używać tej klasy z jednostkami utrwalania RESOURCE_LOCAL lub JTA. Jeśli zmienię plik persistence.xml z JTA na RESOURCE_LOCAL, nie powinienem zmieniać kodu.Jak sprawdzić, czy mój EntityManager używa źródła danych JTA lub RESOURCE_LOCAL?
Próbowałem użyć EntityManager.getTransaction(), aby sprawdzić, czy jest aktywna transakcja, ale wywołanie getTransaction() zgłasza wyjątek, jeśli używany jest JTA. Mogłem otoczyć wywołanie metody getTransaction() przy próbie/catch, ale nie chcę uciekać się do obsługi wyjątków. EntityManager.getProperties() nie wyświetla niczego, co wskazuje na JTA lub RESOURCE_LOCAL
Potrzebuję jakiś sposób, aby określić, jakiego rodzaju jednostki trwałości EntityManager (lub EntityManagerFactory) używa w poniższym kodzie.
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(); ...
To spowoduje cofnięcie JTA ... – dmatej
Od wersji JPA 2.1 możesz użyć em.isJoinedTransaction() – dmatej