Ola Pessoal
Estou trabalhando com JPA 2.0 (Hibernate) em um sisteminha Desktop.
Estou trabalhando com uma única conexão, ou seja, crio o DAO gernérico com o EntityManager ao abrir o sistema e utilizo ele para todas as operações necessárias.
Acontece que quando eu deleto uma Objeto (entidade), ele some do banco de dados, mas se eu fizer uma consulta por NamedQuery ele continua aparecendo, ele só some se eu desconectar do banco de dados e conectar denovo, ou seja, se eu o programa e abrir denovo.
Já estou utilizando o método “flush()” no momento de inserir, alterar e excluir objetos, mas isso não resolveu, veja abaixo minha classe DAO.
package dao;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
public class DAO {
private EntityManager em;
/**
* Método construtor que recebe um Objeto EntityManager.
* @param em Objeto do tipo EntityManager.
*/
public DAO(EntityManager em) {
this.em = em;
}
public DAO() {
}
/**
* Este método insere um objeto utilizando o EntityManager.
* @param objeto Objeto da entidade do seu sistema.
*/
public void insere(Object objeto) {
if (!daoValido()) {
return;
}
em.getTransaction().begin();
em.persist(objeto);
em.flush();
em.getTransaction().commit();
try {
em.refresh(objeto);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Este método encontre um Objeto no banco a partir do número de ID.
* @param classe Tipo de Objeto que será retornado.
* @param id Número no formato Inteiro que representa o ID do objeto.
* @return Objeto encontrado a partir do parámetro passado no ID.
*/
public Object buscaID(Class classe, String id) {
if (!daoValido()) {
return new Object();
}
Long numeroId;
if (id.isEmpty() || id == null) {
numeroId = Long.parseLong("0");
} else {
numeroId = Long.parseLong(id);
}
Object objeto = em.find(classe, numeroId);
try {
em.refresh(objeto);
} catch (Exception ex) {
ex.printStackTrace();
}
return objeto;
}
/**
* Este método atualiza atualiza um Objeto no Banco de Dados de acordo com seus parâmetros.
* @param objeto Objeto a ser atualizado no banco de dados.
*/
public void atualiza(Object objeto) {
if (!daoValido()) {
return;
}
em.getTransaction().begin();
em.merge(objeto);
em.flush();
em.getTransaction().commit();
try {
em.refresh(objeto);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Este método remove um Objeto cadastrado no banco de dados.
* @param objeto Objeto que será removido do banco de dados.
*/
public void remove(Object objeto) throws Exception {
if (!daoValido()) {
return;
}
try {
em.refresh(objeto);
} catch (Exception ex) {
ex.printStackTrace();
}
em.getTransaction().begin();
em.remove(objeto);
em.flush();
em.getTransaction().commit();
}
/**
* Este método retorna uma lista de objetos de acordo com o SELECT em SQL passado por parâmetro.
* @param selectSql Comando SQL contendo o SELECT desejado.
* @return Lista genérica de objetos encontrados no campo de dados.
*/
public List seleciona(String selectSql) {
if (!daoValido()) {
return new ArrayList();
}
List lstResultado = em.createQuery(selectSql).getResultList();
return lstResultado;
}
/**
* Este método retorna uma lista contendo todos os objetos do Tipo que lhe for indicado.
* @param classe String contendo o Nome da classe no qual os objetos serão retornados.
* @param ordernarPor String contendo o Nome do atributo da classe no qual a lista será ordenada.
* @return Lista Lista genérica de objetos encontrados no campo de dados.
*/
public List selecionaTodos(Class classe, String ordernarPor) {
if (!daoValido()) {
return new ArrayList();
}
List lstResultado = em.createQuery("SELECT x FROM " + classe.getSimpleName() + " x ORDER BY x." + ordernarPor).getResultList();
return lstResultado;
}
private boolean daoValido() {
if (em == null) {
System.err.println("DAO INVALIDO: erro ao tentar utilizar DAO");
return false;
}
return true;
}
/**
* Este método retorna a EntityManager usada no DAO.
* @return Objeto do tipo EntityManager.
*/
public EntityManager getEntityManager() {
return em;
}
public List consultarNativo(String sql) {
return em.createNativeQuery(sql).getResultList();
}
public void refreshObjeto(Object object) {
em.refresh(object);
}
}
Alguem tem idéia de como contornar o problema?
Não gostaria de ter que ficar desconectando e conectando de novo do banco de dados.
Abraços
Douglas Junior