HIBERNATE + ANNOTATIONS: qual eh a melhor forma de lidar com esse erro de DELETE?

3 respostas
R

Pessoal,
a seguinte sequencia de logs no ECLIPSE me foi apresentada, resultando em um erro no final:

"

10:20:18,328 DEBUG DefaultSaveOrUpdateEventListener:142 - object already associated with session: [detam.vo.ProdutoVariante#1]

10:20:18,328 DEBUG CascadingAction:133 - cascading to saveOrUpdate: detam.vo.ProdutoVariante

10:20:18,328 DEBUG AbstractSaveEventListener:436 - persistent instance of: detam.vo.ProdutoVariante

10:20:18,328 DEBUG DefaultSaveOrUpdateEventListener:105 - ignoring persistent instance

10:20:18,328 DEBUG DefaultSaveOrUpdateEventListener:142 - object already associated with session: [detam.vo.ProdutoVariante#3]

10:20:18,328 DEBUG CascadingAction:133 - cascading to saveOrUpdate: detam.vo.ProdutoVariante

10:20:18,328 DEBUG AbstractSaveEventListener:446 - deleted instance of: detam.vo.ProdutoVariante

10:20:18,328 DEBUG DefaultSaveOrUpdateEventListener:161 - saving transient instance

10:20:18,328 DEBUG SessionImpl:1016 - flushing to force deletion of re-saved object: [detam.vo.ProdutoVariante#10]

10:20:18,343  WARN RequestProcessor:516 - Unhandled Exception thrown: class org.hibernate.ObjectDeletedException



10:20:18,343 ERROR [action]:253 - Servlet.service() for servlet action threw exception

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [detam.vo.ProdutoVariante#10]



at org.hibernate.impl.SessionImpl.forceFlush(SessionImpl.java:1023)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:168)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:98)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)

at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:531)

at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523)

at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:134)

at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)

at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:290)

at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)

at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)

at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)

at org.hibernate.engine.Cascade.cascade(Cascade.java:248)

at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:130)

at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:121)

at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)

at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)

at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)

at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)

at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)

at detam.dao.DAOPadrao.excluir(DAOPadrao.java:58)

at detam.action.AlteraProdutoVarianteAction.execute(AlteraProdutoVarianteAction.java:45)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)

at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

at java.lang.Thread.run(Thread.java:595)

"

Tenho as classes de VO: “Produto” que tem uma lista de objetos de “ProdutoVariante”, q por sua vez tem uma lista de objetos de “ProdutoVarianteTamanho”.

Preciso excluir um objeto “ProdutoVariante” de um objeto “Produto” e ocorre esse erro. Jah pesquisei aqui msm sobre o erro. Achei algo semelhante, mas n funcionou.
Dois detalhes importantes:

  1. depois que dah esse erro, nenhuma outra execucao de metodo (insert, delete ou update) funciona. Jah os selects funcionam.
  2. quando eu deixava o cadastro de “ProdutoVariante” separado (nao na mesma pagina do “Produto”, ele funcionava sem erro. Quando eu pus na mesma pagina, comecou a dar esse erro.

Se alguem puder me dizer porque estah ocorrendo esse erro e tiver a solucao, ficarei mto grato.
Estou usando ANNOTATIONS.
Bom, aih vai o codigo fonte:

@Entity
@Table(name = "produto")
public class Produto implements VO {
	private Integer id;	
	private Set<ProdutoVariante> variantes;
	...
    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="id_produto")
    public Set<ProdutoVariante> getVariantes() {
        return variantes;
    }
    public void setVariantes(Set<ProdutoVariante> variantes) {
        this.variantes = variantes;
    }
}

@Entity
@Table(name = "prod_variante")
public class ProdutoVariante implements VO{
	private Integer id;
	private Produto produto;	
	private Set<ProdutoVarianteTamanho> tamanhos;
	
	@OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="id_prod_variante")
    public Set<ProdutoVarianteTamanho> getProdutosVariantesTamanhos() {
        return tamanhos;
    }
    public void setProdutosVariantesTamanhos(Set<ProdutoVarianteTamanho> t) {
        this.tamanhos = t;
    }
}

@Entity
@Table(name = "prod_var_tamanho")
public class ProdutoVarianteTamanho implements VO{
	private Integer id;
	private ProdutoVariante produtoVariante;
}

public interface VO {
	
}

Desde jah, fico grato.
E espero ter deixado claro.
[]s

3 Respostas

urubatan

deletei a outra copia deste post :smiley:

voltando ao erro.
isto quer dizer que tu deletou um objeto e mandou salvar outro objeto que fazia referencia a ele (talvez pro uma colelction ou algo assim).
ou seja é um simples erro de programação :smiley:

R

eu postei em dois lugares, pq havia postado em um forum q n havia sentido e ngm havia respondido.
hehe…valeu…
vou dar uma olhada aqui…
obrigadoo hein…
[]s

R

certo…
tentei aqui algumas coisas, mas nao funcionou.
o q eu n entendo e n sei o porque eh:
como q antes qdo eu (utilizando as mesmas paginas) deixava em telas separadas os cadastros, eu conseguia excluir e n dava erro e agora, deixando na mesma tela do Produto, dah esse erro?
e um outro aspecto: pq apos dar esse erro n consigo , por exemplo, inserir um fornecedor? continua dando o mesmo erro. o q fazer p n haver essa dependencia de erro?
eh isso…fico aguardando resposta.
obrigado.

vou colocar minha action q exclui o ProdutoVariante, okz:

AlteraProdutoVarianteAction

public class AlteraProdutoVarianteAction extends ForwardAction {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		DAOPadrao dao = new DAOPadrao(ProdutoVariante.class, request.getSession());		

		String id = request.getParameter("id");

		ProdutoVariante escolhido;
		if (id == null) {
			escolhido = new ProdutoVariante();
		} else {
			escolhido = (ProdutoVariante) dao.obter(Integer.valueOf(id));
		}
		// se nao achar o produtoVariante, cria um novo
		if (escolhido == null) {
			escolhido = new ProdutoVariante();
		}

		if ("1".equals(request.getParameter("exclui"))) {
			try {
                            escolhido.getPhotoManager().excluiArquivo("img.jpg");	
				dao.excluir(escolhido);		
			} catch (TransientObjectException e) {
				// sem problemas, o produtoVariante nao existia
			}
			return new ActionForward("/alteraProduto.do?id="+escolhido.getProduto().getId());
		}	
		
		request.setAttribute("produtoVariante", escolhido);

		return new ActionForward(mapping.getParameter());
	}
}
Criado 12 de maio de 2006
Ultima resposta 17 de mai. de 2006
Respostas 3
Participantes 2