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(); ...
Điều này sẽ gây ra JTA rollback ... – dmatej
Vì JPA 2.1 bạn có thể sử dụng em.isJoinedTransaction() – dmatej