Java 验证jpa中的实体管理器

Java 验证jpa中的实体管理器,java,jpa,Java,Jpa,我有一种方法来验证我的实体管理器是否有效。但是,在某些时间间隔内,调用将停止返回数据。如果在DB查询窗口中使用相同的sql进行查询,它将返回预期的记录 我是否错过了某种验证,以确保它实际上是有效的 private void validateEntityManager() { try { if (em == null || !em.isOpen()) em = factory.createEntityManager();

我有一种方法来验证我的实体管理器是否有效。但是,在某些时间间隔内,调用将停止返回数据。如果在DB查询窗口中使用相同的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();
        }
    }