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

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

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:

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

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