2011-11-04 28 views
5

Aşağıda gösterildiği gibi bir yardımcı program sınıfım var. Bu sınıfı RESOURCE_LOCAL veya JTA kalıcılık birimleriyle birlikte kullanmak istiyorum. Persistence.xml dosyasını JTA'dan RESOURCE_LOCAL olarak değiştirirsem, kodu değiştirmem gerekir.EntityManager'ım JTA veya RESOURCE_LOCAL veri kaynağını mı kullandığını nasıl anlarım?

Etkin bir işlem olup olmadığını görmek için EntityManager.getTransaction() yöntemini kullanmayı denedim, ancak JTA kullanılıyorsa getTransaction() işlevi bir Özel Durum atar. Bir try/catch ile getTransaction() çağrısını çevreliyorum ama bunun için Exception işlemine başvurmak istemiyorum. EntityManager.getProperties(), JTA veya RESOURCE_LOCAL

'u gösteren hiçbir şeyi göstermiyor. EntityManager'ın (veya EntityManagerFactory) aşağıdaki kodda ne tür kalıcılık birimi kullandığını söylemenin bir yoluna ihtiyacım var.

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

cevap

2

İki varlık yöneticisi türleri için işlemler için farklı API'ler dayanan böyle bir şey, deneyebilirsiniz:

public boolean isResourceLocal(EntityManager em) { 

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

} 
+0

Bu JTA geri dönüşüne neden olur ... – dmatej

+0

JPA 2.1 beri em.isJoinedTransaction() kullanabilirsiniz – dmatej

0

Bir JTA varlık yöneticisi üzerinde getTransaction() diyoruz, kalıcılık sağlayıcısı atar bir IllegalStateException.

Detaylar için javadoc bakınız:

EntityTransaction getTransaction()

İade kaynak düzey EntityTransaction nesnesi. EntityTransaction örneği, birden çok işlemi başlatmak ve işlemek için seri olarak kullanılabilir.

İade: EntityTransaction örneği

Atmalar: IllegalStateException - Bir JTA varlık yöneticisi

üzerine çağrılan eğer EclipseLink kullandığınızda bu geçerli hareket geri neden olur:

public EntityTransaction getTransaction() { 
    try { 
     return ((TransactionWrapper)this.transaction).getTransaction(); 
    } catch (RuntimeException e) { 
     setRollbackOnly(); 
     throw e; 
    } 
} 
İlgili konular