2011-11-04 22 views
5

Tôi có một lớp tiện ích như hình dưới đây. Tôi muốn có thể sử dụng lớp này với các đơn vị RESOURCE_LOCAL hoặc JTA persistence. Nếu tôi thay đổi persistence.xml từ JTA thành RESOURCE_LOCAL, tôi không phải thay đổi mã.Làm cách nào để biết liệu EntityManager của tôi có đang sử dụng nguồn dữ liệu JTA hoặc RESOURCE_LOCAL không?

Tôi đã thử sử dụng EntityManager.getTransaction() để xem liệu có giao dịch đang hoạt động hay không, nhưng lệnh gọi getTransaction() ném ra Ngoại lệ nếu JTA đang được sử dụng. Tôi có thể bao quanh các cuộc gọi đến getTransaction() với một thử/catch nhưng tôi không muốn nghỉ mát để xử lý ngoại lệ cho việc này. EntityManager.getProperties() không hiển thị bất cứ điều gì cho biết JTA hoặc RESOURCE_LOCAL

Tôi cần một số cách để biết loại đơn vị kiên trì nào mà EntityManager (hoặc EntityManagerFactory) đang sử dụng trong mã bên dưới.

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

Trả lời

2

Bạn có thể thử một cái gì đó như thế này, mà dựa trên các API khác nhau cho các giao dịch cho các loại quản lý hai thực thể:

public boolean isResourceLocal(EntityManager em) { 

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

} 
+0

Điều này sẽ gây ra JTA rollback ... – dmatej

+0

Vì JPA 2.1 bạn có thể sử dụng em.isJoinedTransaction() – dmatej

0

Khi bạn gọi getTransaction() về một người quản lý thực thể JTA, nhà cung cấp bền bỉ ném an IllegalStateException.

Xem javadoc để biết chi tiết:

EntityTransaction getTransaction()

Return đối tượng EntityTransaction nguồn cấp. Ví dụ EntityTransaction có thể được sử dụng serially để bắt đầu và thực hiện nhiều giao dịch.

Returns: EntityTransaction dụ

Ném: IllegalStateException - nếu gọi vào một người quản lý JTA thực thể

Khi bạn sử dụng EclipseLink điều này gây ra một rollback trên giao dịch hiện tại:

public EntityTransaction getTransaction() { 
    try { 
     return ((TransactionWrapper)this.transaction).getTransaction(); 
    } catch (RuntimeException e) { 
     setRollbackOnly(); 
     throw e; 
    } 
} 
Các vấn đề liên quan