在jpa中验证实体管理器

时间:2016-01-22 12:51:56

标签: java jpa

我有一种方法可以验证我的实体管理器是否有效。但是,在某些时间间隔,呼叫将停止返回数据。如果使用相同的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();
        }
    }

0 个答案:

没有答案