bom dia, estou tentando implementar um método para remover itens do banco de dados usando hibernate, no entanto esta apresentando os seguinte erro DETACHED, dei uma lida e entendi um pouco sobre o assunto, mas não estou conseguindo implementar em meu código, vou por aqui meu método salvar e meu método excluir e a resposta do compilador.
Metodo remover aprensenta erro detached java/hibernate
17 Respostas
Da próxima vez coloque o código em texto, print só dificulta.
Pesquise sobre a mensagem de erro. Exemplo do que vai encontrar:
não foi de muita ajuda, nao estou trabalhando com Session
Ele não usou session, usou entityManager (em).
mesmo assim nao funcionou, ou meu ingles nao ta muito bom rs
Esse erro é porque o seu objeto não esta “atachado” ao contexto da JPA
você tem que dar um em.find antes de remover
Dar um select a toa com find só pra deletar um registro não é eficiente, embora funcione. É um dos desperdícios de recursos que mais vejo em projetos hibernate/JPA.
Haha verdade, mas funciona mesmo.
Eu ainda não sei porque tem casos que não precisa do find e tem casos que precisa.
public void excluir(T t) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranethope");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.find(classe, t);
em.remove(t);
em.getTransaction().commit();
}
ficaria assim o método excluir?
Segundo a documentação merge deveria resolver isso. O ideal mesmo é usar HQL/JPQL, não tem erro.
Ainda não, você precisa pegar o retorno do find e então passar como parâmetro no remove
public T buscarPorID(int id) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranethope");
EntityManager em = emf.createEntityManager();
return em.find(classe, id);
}
public void excluir(T t) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranethope");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.remove(t);
em.getTransaction().commit();
}
@Test
public void testeExcluir() {
EstadoDAO dao = new EstadoDAO();
Estado outroEst = dao.buscarPorID(6);
dao.excluir(outroEst);
}
ainda assim nao funciona, o que eu faço? 



peguei o retorno do find, que esta no metodo buscaporID mesmo assim da o erro
Deixa o find dentro do excluir
só adaptar…
em.getTransaction().begin();
Estado estado = em.find(Estado.class, valor);
em.remove(estado);
em.getTransaction().commit();
mas de onde eu vou tirar essa valor? vou ter que passar por parâmetro também??
public void excluir(T t, int id) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("intranethope");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
T busca = em.find((Class<T>) t, id);
em.remove(busca);
em.getTransaction().commit();
}
@Test
public void testeExcluir() {
EstadoDAO dao = new EstadoDAO();
Estado outroEst = dao.buscarPorID(17);
dao.excluir(outroEst, outroEst.getCodigo());
//Estado x = dao.buscarPorID(outroEst.getCodigo());
}
Funcionou Mike! obrigado de novo!


