Metodo remover aprensenta erro detached java/hibernate

17 respostas
eclipseprogramaçãojavahibernate
A

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.



17 Respostas

J

Da próxima vez coloque o código em texto, print só dificulta.

Pesquise sobre a mensagem de erro. Exemplo do que vai encontrar:

A

não foi de muita ajuda, nao estou trabalhando com Session

J

Ele não usou session, usou entityManager (em).

A

mesmo assim nao funcionou, ou meu ingles nao ta muito bom rs

M

Esse erro é porque o seu objeto não esta “atachado” ao contexto da JPA
você tem que dar um em.find antes de remover

J

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.

M

Haha verdade, mas funciona mesmo.
Eu ainda não sei porque tem casos que não precisa do find e tem casos que precisa.

A
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?

J

Segundo a documentação merge deveria resolver isso. O ideal mesmo é usar HQL/JPQL, não tem erro.

M

Ainda não, você precisa pegar o retorno do find e então passar como parâmetro no remove

A
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);
}
A

ainda assim nao funciona, o que eu faço? :cry::cry::cry::cry:

peguei o retorno do find, que esta no metodo buscaporID mesmo assim da o erro

M

Deixa o find dentro do excluir

só adaptar…

em.getTransaction().begin();
Estado estado = em.find(Estado.class, valor);
em.remove(estado);
em.getTransaction().commit();
A

mas de onde eu vou tirar essa valor? vou ter que passar por parâmetro também??

A
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();
}
A
@Test
public void testeExcluir() {

	EstadoDAO dao = new EstadoDAO();
	Estado outroEst = dao.buscarPorID(17);

	dao.excluir(outroEst, outroEst.getCodigo());
	
	//Estado x = dao.buscarPorID(outroEst.getCodigo());
}
A

Funcionou Mike! obrigado de novo!

Criado 31 de março de 2018
Ultima resposta 1 de abr. de 2018
Respostas 17
Participantes 3