Java 验证jpa中的实体管理器
我有一种方法来验证我的实体管理器是否有效。但是,在某些时间间隔内,调用将停止返回数据。如果在DB查询窗口中使用相同的sql进行查询,它将返回预期的记录 我是否错过了某种验证,以确保它实际上是有效的Java 验证jpa中的实体管理器,java,jpa,Java,Jpa,我有一种方法来验证我的实体管理器是否有效。但是,在某些时间间隔内,调用将停止返回数据。如果在DB查询窗口中使用相同的sql进行查询,它将返回预期的记录 我是否错过了某种验证,以确保它实际上是有效的 private void validateEntityManager() { try { if (em == null || !em.isOpen()) em = factory.createEntityManager();
private void validateEntityManager() {
try {
if (em == null || !em.isOpen())
em = factory.createEntityManager();
if (!em.isOpen() || !em.isJoinedToTransaction()) {
em.getTransaction().begin();
}
} catch (javax.persistence.TransactionRequiredException ex) {
recreateEM();
}
}
private void recreateEM() {
try {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
em = factory.createEntityManager();
em.getTransaction().begin();
} catch (Exception ex) {
logger.error("Database error: " + ex.getMessage());
}
}
返回数据的方法
public List<T[]> selectNativeQuery(String sql) {
validateEntityManager();
Query query = em.createNativeQuery(sql);
List<T[]> listObj = query.getResultList();
return listObj;
}
你在哪里结束交易?如果我保存,我会在最后结束。
public void saveToDatabase(T obj) {
// select(obj);
validateEntityManager();
try {
em.persist(obj);
em.getTransaction().commit();
em.close();
} catch (RollbackException | DatabaseException | javax.persistence.EntityExistsException e) {
logger.debug(obj.toString());
e.printStackTrace();
} catch (javax.persistence.TransactionRequiredException ex) {
logger.error("Failed to execute transaction: " + obj.toString() );
ex.printStackTrace();
}
}