O método acima ( E que funciona ) é chamado da seguinte forma:
// Instancio o usuario com o id teste
AsUsuario usuario = buscaUsuario("teste");
// Agora vou remover o danado.
dao.remove(usuario.getClass(),usuario.getIdUsuario);
Notem que mesmo o meu id sendo uma String o metódo funciona perfeitamente. Exclui o registro do banco. Bom, gostaria de tornar isso mais dinamico e não sei se isso é possivel e por isso criei este post. Gostaria de fazer algo do tipo:
public boolean remove(Object obj) {
try {
em = FactoryConnection.getEntityManager();
em.getTransaction().begin();
em.remove(em.find(obj.getClass(), obj.getClass().getId)); //<- Tentativa 1 - Não existe isso rs
em.remove(obj.getClass()); // <- Tentativa 2 - Não funciona .. disse que eu tenho que passar um ID
em.remove(em.find(obj.getClass(),19L)); // <- Tentativa 3 - Funciona, mas disse que o ID recebido foi uma String e o esperado é um long
em.getTransaction().commit();
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
} finally {
FactoryConnection.closeEm();
}
}
Em resumo, gostaria de passar para o metodo remove um objeto já com a instancia correta e gostaria que ele pudesse excluir sem que o id fosse informado, ou então descobrir uma forma de encontrar o ID do objeto de forma dinamica. O Insert, Update já funciona… meu problema está com o delete.
O objeto a ser passado para o metodo remove seria:
String nomeClasse = "br.com.estudo.model.AsUsuario";
Object objPersistir = Class.forName(nomeClasse).newInstance();
iterator = listDeleted.iterator(); // Lista de Objetos AsUsuario.
while ( iterator.hasNext()){
objPersistir = iterator.next();
dao.remove(objPersistir);
}
Eu tenho uma lista, esta lista poderá ser instanciada com objetos diversos. Uma hora podera ser preenchida com AsUsuario, outra hora poderá ser preenchida com GeCidade, outra hora poderá ser preenchida com GeEstado e por aí vai.
List result = new ArrayList();
String objControle = "";
A lista acima é instanciada após uma consulta no banco de dados e neste momento eu guardo em uma variavel o nome do objeto que está na Lista.
result = buscarUsuarios();
objetoControle = "AsUsuario";
3 ) Tenho metodos que removem itens dessa lista, incluem itens nesta lista e removem itens nesta lista.
Iterator iterator;
String nomeClasse = "br.com.estudo.model."+objetoControle;
Object objPersistir = Class.forName(nomeClasse).newInstance();
iterator = result.iterator();
while ( iterator.hasNext()){
objPersistir = iterator.next();
// Se houve um update ou um insert eu chamo o metodo abaixo
dao.update(objPersistir);
// Se houve um delete eu chamo o metodo
dao.delete( objPersistir.getClass, ???); // E é aqui que surgiu todo o problema. Como vou saber qual é o Id a ser passado ?
}
Você está usando Hibernate e eu estou usando JPA. Sera que é aí que tem a diferença hein ? Eu tentei fazer assim, só passando o objeto, mas ele dá um erro. Ele diz que eu preciso informar a PK e tals.
atah, me desculpe, achei que estivesse usando Hibernate, porque o JPA é inspirado no hibernate, então achei que também dava para fazer desse jeito para o seu caso…
Só complementando o que mauricionarcizo falou, no Objeto Session já existe um método delete o qual recebe por parametro um objeto que sendo mapeado é feta a exclusão “automatica” sem a necessidade de informar tabela, como sua lista vai ser populada a partir de uma consulta ao banco ela já vai estar com o id, e caso você insira um objeto no banco ele vai receber o id, dessa forma o metodo remove a partir do mapeamento da classe já saberá qual o id do objeto e sua tabela e irá remove-ló do banco.
Dureza né ? Pensei em uma gambi aqui. Gravar o metodo que representa a chave composta em uma variavel e executar este metodo dinamicamente para a exclusão. Mas é fods né ? Queria um jeito certo de fazer, ficaria mais bonito.