[RESOLVIDO] Altera relacionamento

5 respostas
david.cs20

Ola
A minha duvida e a seguinte:
Tenho um relacionamento OneToMany a qual crio um grupo de objetos.
Porem ao excluir esse grupo não queria que esse objetos que estão na outra tabela fossem excluído e sim que o id do relacionamento fosse modificado para null.

Segue abaixo o código que faço o relacionamento e toda as anotações:

@OneToMany(mappedBy="grupoComoEntrevistador",cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REMOVE,})
	private Collection<Objeto> colecao;

5 Respostas

Hebert_Coelho

Faça setColecao(null); antes de excluir.

david.cs20

Fiz isso porem ele fica exibindo o seguinte erro:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ws.futuranet.modelo.Grupo.entrevistadores, no session or session was closed br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Hebert_Coelho

Faça um find no seu objeto, depois set null e depois delete. sua lista está como lazy. Por isso da erro.

OBS.: Faça tudo no mesmo método.

david.cs20

Pode me da um exemplo pois não entendi !

Estou fazendo da seguinte maneira:

public void excluir(Long id) { Grupo grupo = get(id); Collection<Usuario> entrevistadores = new ArrayList<Usuario>(); for (Usuario entrevistador : grupo.getEntrevistadores()) { Usuario entrevistadorPersistente = usuarioDao.get(entrevistador.getId()); entrevistadores.add(entrevistadorPersistente); entrevistadorPersistente.setGrupoComoEntrevistador(null); usuarioDao.saveOrUpdate(entrevistadorPersistente); } grupo.setEntrevistadores(entrevistadores); delete(id); }

david.cs20

Resolvi colocando a seguinte anotação:

Ai quando excluo o pai o filho perde o vinculo mais não e excluído.

@OneToMany(cascade={CascadeType.MERGE}, targetEntity=Objeto.class, fetch=FetchType.EAGER) @JoinColumn(name="colecao_id") private Collection<Objeto> colecao;

Criado 29 de março de 2012
Ultima resposta 30 de mar. de 2012
Respostas 5
Participantes 2