2011-11-04 4 views
5

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(); ... 

Odpowiedz

2

Można spróbować czegoś takiego, który opiera się na różnych API dla transakcji dla typów menedżera dwie jednostki:

public boolean isResourceLocal(EntityManager em) { 

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

} 
+0

To spowoduje cofnięcie JTA ... – dmatej

+0

Od wersji JPA 2.1 możesz użyć em.isJoinedTransaction() – dmatej

0

Po wywołaniu getTransaction() na stanowisku kierownika jednostki JTA, dostawca wytrwałość rzuca IllegalStateException.

Zobacz javadoc do szczegółów:

EntityTransaction getTransaction()

Zwraca obiekt EntityTransaction zasobów poziom. Instancja EntityTransaction może być używana seryjnie w celu rozpoczęcia i zatwierdzenia wielu transakcji.

Powroty: instancji EntityTransaction

rzuca: IllegalStateException - jeśli wywoływany na stanowisku kierownika jednostki JTA

Podczas korzystania EclipseLink powoduje cofnięcia na bieżącej transakcji:

public EntityTransaction getTransaction() { 
    try { 
     return ((TransactionWrapper)this.transaction).getTransaction(); 
    } catch (RuntimeException e) { 
     setRollbackOnly(); 
     throw e; 
    } 
} 
Powiązane problemy