ThreadLocal Sessions no Hibernate, deletando registro?

Estou usando um pattern de ThreadLocal implementado pelo paulo aki no GUJ, so q estou tendo problema quando vou excluir um objeto do banco.

por exemplo:
quando apago um objeto, blz sem problema vai na boa
mas quando tento apagar outra em seguida da uma erro, q esta logo abaixo

codigo do metodo q e executado da class DAO

  public void delete(ArtigoValue value) throws Exception {
    Session session =cisa.model.HibernateSessionFactory.getFactory().getSession();
    session.delete(value);
    session.flush();
    session.connection().commit();
  }

quando tento excluir mas de um objeto, ou seja apago um e depois mas algum da esse erro:

net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 74, of class: cisa.model.artigo.ArtigoValue

	at net.sf.hibernate.impl.SessionImpl.delete(SessionImpl.java:1140)

	at cisa.model.artigo.ArtigoDAO.delete(ArtigoDAO.java:55)

	at cisa.model.artigo.ArtigoFacade.save(ArtigoFacade.java:34)

	at cisa.view.artigo.root.ViewArtigoAction.removeObject(ViewArtigoAction.java:87)

	at cisa.view.util.GenericTableAction.perform(GenericTableAction.java:189)

	at cisa.view.artigo.root.ViewArtigoAction.perform(ViewArtigoAction.java:66)

	at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1787)

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

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

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

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

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

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

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

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

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

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

	at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)

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

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

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

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

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

	at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

	at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)

	at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)

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

ta muito estranho
manda o codigo onde voce ta deletando um e depois outro. manda o for.

curti teu site, soh nao curti seu throws Exception no codigo :slight_smile:

implementa um equals e um hascode na tua classe, que o problema se resolve

Obrigado Paulo pela a colaboração e obrigado mais ainda pelo “curti teu site”…rs

bem não seria bem um “for” que estou executando, seria algo assim tenho uma tabela de registros aonde o usuario pode excluir/alterar/inserir registro, certo
veja esse exemplo [ http://www.woniz.com/upload/exemplo.htm ]

quando o usuario apaga um registro eu apago o registro com aquele metodo “delete” e faço uma nova consulta para voltar a tabela, ate ai vai blz, agora quando tento tento excluir outro registro ele dar esse erro

se não fui claro, amanhã 27/08 quando chegar no trabalho postarei o codigo para facilitar ou se era para funcionar, pode ser que eu tenha feito algo errado

thanks…

implementa um equals e um hascode na tua classe, que o problema se resolve

hummm…acho q nesse caso o hasCode não resolve hein?? :lol:

pessoal na verdade foi um pequeno discuido com meu

eu estava fazendo assim

  protected boolean removeObject(Integer pk){
    LetreiroValue value = new LetreiroValue();
    value.setPk(pk);
    value.setStatusModel(AbstractModel.DELETE);
    LetreiroFacade facade = new LetreiroFacade();
    return facade.save(value);
  }

o problema de fazer assim q o objeto q eu estou tentando apagar não e o mesmo da sessao

agora se fizer assim vai na boa sem problema

  protected boolean removeObject(Integer pk){
    LetreiroValue value = null;
    try{
      value = (new LetreiroLoader()).findByPK(pk);
    }catch(Exception e){e.printStackTrace();}
    value.setStatusModel(AbstractModel.DELETE);
    LetreiroFacade facade = new LetreiroFacade();
    return facade.save(value);
  }

valeu velhinhos…
at++