我有一种方法可以验证我的实体管理器是否有效。但是,在某些时间间隔,呼叫将停止返回数据。如果使用相同的sql查询到数据库查询窗口,它将返回预期的记录。
我是否缺少某种验证以确保它确实有效?
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();
}
}