-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: detached entity passed to persist
PostPosted: Mon Sep 08, 2008 9:38 am 
Newbie

Joined: Mon Sep 01, 2008 3:41 am
Posts: 19
Hi all!

When I try to save a row in a table the application server throws to me this exception:

Code:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.uw.diode.entity.ParametrosInforme; nested exception is javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.uw.diode.entity.ParametrosInforme
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488)
   org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:441)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


This is the line of code:
Code:
public ParametrosInforme guardar(ParametrosInforme parametrosInforme) {
      final boolean isNew = parametrosInforme.getId() == -1;
      
      final ParametrosInforme pi = getJpaTemplate().merge(parametrosInforme);
      
      if (!isNew) {         
         getJpaTemplate().persist(pi);
        }
      
        return pi;
   }


When the application do the merge method in server I can see:
Code:
[http-8080-1] DEBUG org.hibernate.ejb.AbstractEntityManagerImpl  - mark transaction for rollback


And when use the persist method it throws the exception.

I have two tables linking by a foreign key in many to one:

Table ReportCabecera:
Code:
   create table ReportCabecera(
      Recab_idReportCabecera      number(10) not null,
      Recab_Clave                 varchar2(20),
      Recab_Descorta              varchar2(100),
      Recab_Deslarga              varchar2(500),
      Recab_Area                  varchar2(20),
      Recab_Disponibledesde       date,
      Recab_DisponibleHasta       date,
      Recab_Nomberuta             varchar2(200),
      Recab_Fegraba               date,
      Recab_Emgraba               varchar2(20)
   )tablespace TBLSPACEUWMVC;


Table ParametrosInforme
Code:
   create Table ReportParametros(
      Repa_idReportParametros          number(10) not null,
      Repa_IdReportCabecera            number(10) not null,
      Repa_Clave                       varchar2(30),
      Repa_Nombre                      varchar2(100),
      Repa_Tipo                        varchar2(1),
      Repa_Valor                       varchar2(1),
      Repa_Maximo                      number(3),
      Repa_Fegraba                     date,
      Repa_Emgraba                     varchar2(20)
   )tablespace TBLSPACEUWMVC;


I can have a Many ParametrosInforme rows for each ReportCabecera row.

And here you have the Entity:

Code:
package com.uw.diode.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="ReportParametros")
public class ParametrosInforme implements Serializable {

   /**
    *
    */
   private static final long serialVersionUID = 1317245204391348960L;
   
   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "REPORTPARAMETROS_SEQ")
   @SequenceGenerator(name="REPORTPARAMETROS_SEQ", sequenceName = "REPORTPARAMETROS_SEQ")
   @Column(name="Repa_IdReportParametros", precision=10)
   private long id;
   
   @ManyToOne
   @JoinColumn(name = "Repa_IdReportCabecera", referencedColumnName = "Recab_idReportCabecera")
   private CabeceraInforme idCabeceraInforme;
   
   @Column(name="Repa_Clave", length=30)
   private String clave;
   
   @Column(name="Repa_Nombre", length=100)
   private String nombre;
   
   @Column(name="Repa_Tipo", length=1)
   private String tipo;
   
   @Column(name="Repa_Valor", length=1)
   private String tipoValor;
   
   @Column(name="Repa_Maximo", precision=3)
   private Long longitud;
   
   @Column(name="Repa_Fegraba")
   private Date fechaGrabacion;
   
   @Column(name="Repa_Emgraba", length=20)
   private String empleadoGrabacion;

   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }

   public CabeceraInforme getIdCabeceraInforme() {
      return idCabeceraInforme;
   }

   public void setIdCabeceraInforme(CabeceraInforme idCabeceraInforme) {
      this.idCabeceraInforme = idCabeceraInforme;
   }

   public String getClave() {
      return clave;
   }

   public void setClave(String clave) {
      this.clave = clave;
   }

   public String getNombre() {
      return nombre;
   }

   public void setNombre(String nombre) {
      this.nombre = nombre;
   }

   public String getTipo() {
      return tipo;
   }

   public void setTipo(String tipo) {
      this.tipo = tipo;
   }

   public String getTipoValor() {
      return tipoValor;
   }

   public void setTipoValor(String tipoValor) {
      this.tipoValor = tipoValor;
   }

   public Long getLongitud() {
      return longitud;
   }

   public void setLongitud(Long longitud) {
      this.longitud = longitud;
   }

   public Date getFechaGrabacion() {
      return fechaGrabacion;
   }

   public void setFechaGrabacion(Date fechaGrabacion) {
      this.fechaGrabacion = fechaGrabacion;
   }

   public String getEmpleadoGrabacion() {
      return empleadoGrabacion;
   }

   public void setEmpleadoGrabacion(String empleadoGrabacion) {
      this.empleadoGrabacion = empleadoGrabacion;
   }

}


and the DAO:

Code:
package com.uw.diode.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.exception.DataException;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import com.uw.diode.entity.ParametrosInforme;
import com.uw.diode.service.ParametrosInformeService;

public class ParametrosInformeDAO extends JpaDaoSupport implements
      ParametrosInformeService {

   @SuppressWarnings("unchecked")
   @Override
   public List<ParametrosInforme> findAll(long ci) {
      List<ParametrosInforme> listaParametros = getJpaTemplate().find("select pi" +
            " from ParametrosInforme pi" +
            " where pi.idCabeceraInforme.id=?1",ci);
      
         return listaParametros;
   }

   public ParametrosInforme guardar(ParametrosInforme parametrosInforme) {
      final boolean isNew = parametrosInforme.getId() == -1;
      
      final ParametrosInforme pi = getJpaTemplate().merge(parametrosInforme);
      
      if (!isNew) {         
         getJpaTemplate().persist(pi);
        }
      
        return pi;
   }
   
   public ParametrosInforme actualizar(ParametrosInforme parametrosInforme) throws DataException,HibernateException {
      getJpaTemplate().merge(parametrosInforme);
      
      return parametrosInforme;
   }

   @SuppressWarnings("unchecked")
   @Override
   public ParametrosInforme encuentraPorId(long idInforme) {
      List<ParametrosInforme> listaParametros = getJpaTemplate().find("select pi" +
            " from ParametrosInforme pi" +
            " where pi.id=?1",idInforme);
      
      ParametrosInforme pi = new ParametrosInforme ();
      
      if (listaParametros.size() > 0)
         pi = listaParametros.get(0);
      
      return pi;
   }

}



I don't know what is happen. Could you help me, please?

Thanks!

Praedos


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 09, 2008 8:16 pm 
Expert
Expert

Joined: Tue May 13, 2008 3:42 pm
Posts: 919
Location: Toronto & Ajax Ontario www.hibernatemadeeasy.com
Are you doing this within a web app? I often see this when an entity is placed in an HttpSession, and then pulled out again. The object gets detached when put into the HttpSession, and problems like this happen when it is pulled out. Any chance?

_________________
Cameron McKenzie - Author of "Hibernate Made Easy" and "What is WebSphere?"
http://www.TheBookOnHibernate.com Check out my 'easy to follow' Hibernate & JPA Tutorials


Top
 Profile  
 
 Post subject: org.hibernate.PersistentObjectException: detached entity
PostPosted: Mon Dec 15, 2008 4:41 pm 
Newbie

Joined: Mon Dec 15, 2008 1:31 pm
Posts: 4
Hi , I get this exception when trying to persist an object , it does not matter if its the first or second time or so on. I am using an oracle sequence , maybe that can have something to do with this problem , but i am not sure. The application is a webapp this is the code

This is the part where i map the sequence : BloqueoTotal.java

Code:

@Entity
@Table(name = "KSAFITBLOQUEOS")
@NamedQueries({
   @NamedQuery(name="BloqueoTotal.findByCedulaVigente",
         query="SELECT o FROM BloqueoTotal o WHERE o.numafi=:cedula AND o.estado in ('ACT','REG')")
})
@SequenceGenerator(name = "SecBloqueoTotal", sequenceName = "KSAFISBLOQUEOS",allocationSize=1)
public class BloqueoTotal implements Serializable {
   
    private static final long serialVersionUID = 3363158128022354214L;
    private Long aniperfin;
    private Long aniperini;
    private String blocue;
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "SecBloqueoTotal")
    private Long codblo;  ..........



This is the dao class declaration and implementation
Code:

@Local
public interface BloqueoTotalDao extends GenericDao<BloqueoTotal, Long> {

   /**
    * Consulta el bloqueo total de la cuenta individual mas el tipo de bloqueo
    *
    * @param cedula
    * @return una lista objeto con los datos del bloqueo caso contrario una
    *         lista vacia
    * @author cvillarreal,wvalencia
    * @throws NoExisteBloqueoTotalException
    */
   public List<BloqueoTotal> consultarPorCedulaVigente(String cedula) throws NoExisteBloqueoTotalException;

}





Code:
@Stateless
public class BloqueoTotalDaoImpl extends GenericEjbDao<BloqueoTotal, Long>
      implements BloqueoTotalDao {

   private static Logger log = Logger.getLogger(BloqueoTotalDaoImpl.class);

   public BloqueoTotalDaoImpl() {
      super(BloqueoTotal.class);
   }

   /*
    * (non-Javadoc)
    *
    * @see ec.gov.iess.fondosreserva.ctaindividual.dao.BloqueoTotalDao#getBloqueoTotalEager(java.lang.String)
    */
   @SuppressWarnings("unchecked")
   @TransactionAttribute(TransactionAttributeType.SUPPORTS)
   public List<BloqueoTotal> consultarPorCedulaVigente(String cedula) throws NoExisteBloqueoTotalException {
      log.debug(" Cedula : " + cedula);
      try {
         Query q = em.createNamedQuery("BloqueoTotal.findByCedulaVigente");
         q.setParameter("cedula", cedula);
         return q.getResultList();
      } catch (NoResultException e) {
         throw new NoExisteBloqueoTotalException("La consulta no devolvió ningún resultado.");
      }
   }

}





This is the where i try to persist

Code:
   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   private void procesarBloqueoDesbloqueoTotal(BloqueoTotal bloqueoTotal,
         String estado) throws BloqueoTotalException,
         DesbloqueoTotalException {

      log.debug(" procesarBloqueoDesbloqueoTotal - CEDULA "
            + bloqueoTotal.getNumafi());

      StringBuffer cadena = new StringBuffer();

      if (bloqueoTotal != null) {
         cadena.append("TOT 1");
         bloqueoTotal.setEstado(estado);

         if ((BloqueoStatus.ACTIVO.getEstado()).equals(estado)) {
            try {
               cadena.append("TOT BLO 1");
               bloqueoTotal.setFecregblo(new Date());
               bloqueoTotal.setFecregdesblo(null);
               cadena.append("TOT BLO 2");
               bloqueoTotalDao.insert(bloqueoTotal); ///Here the exception is thrown
               // Registrar Historico
               cadena.append("TOT BLO 3");
               bloqueoTotalHistoricoDao.insert(this
                     .generarHistorico(bloqueoTotal));
               cadena.append("TOT BLO 4   ");
            } catch (PersistenceException e) {
               log.error("PersistenceException " + e.getMessage());
               e.printStackTrace();
               throw new BloqueoTotalException(
                     "Error de persistencia en la gestión del bloqueo "
                           + cadena.toString() + " " + e.getMessage());
            } catch (BloqueoTotalHistoricoException e) {
               e.printStackTrace();
               log.error("BloqueoTotalHistoricoException "
                     + cadena.toString() + " " + e.getMessage());
               throw new BloqueoTotalException(
                     "BloqueoTotalHistoricoException "
                           + cadena.toString() + " " + e.getMessage());
            } catch (RuntimeException e) {
               e.printStackTrace();
               log.error("RuntimeException " + cadena.toString() + " "
                     + e.getMessage());
               
               if(e.getCause() != null){
                  if(e.getCause().getCause() != null){
                     if(e.getCause().getCause().getCause() != null){
                        if(e.getCause().getCause().getCause().getCause() != null){
                           cadena.append(" " + e.getCause().getCause().getCause().getCause().getMessage());
                        }
                     }
                  }
               }
               
               throw new BloqueoTotalException(
                     "Error inesperado en la gestión del bloqueo "
                           + cadena.toString() + " " + e.getMessage());
            } catch(Exception e){
               e.printStackTrace();
               log.error("Exception " + cadena.toString() + " "
                     + e.getMessage());
               throw new BloqueoTotalException(
                     "Error inesperado Exception en la gestión del bloqueo "
                           + cadena.toString() + " " + e.getMessage());
            }
         } else {
            cadena.append("TOT DESBLO 1");
            try {
               bloqueoTotal.setFecregdesblo(new Date());
               cadena.append("TOT DESBLO 2");
               bloqueoTotalDao.update(bloqueoTotal);
               cadena.append("TOT DESBLO 3");
               // Registrar Historico
               bloqueoTotalHistoricoDao.insert(this
                     .generarHistorico(bloqueoTotal));
               cadena.append("TOT DESBLO 4");
            } catch (PersistenceException e) {
               e.printStackTrace();
               log.error("2 PersistenceException " + e.getMessage());
               throw new DesbloqueoTotalException(
                     "Error de persistencia en la gestión del desbloqueo "
                           + cadena.toString() + " " + e.getMessage());
            } catch (BloqueoTotalHistoricoException e) {
               e.printStackTrace();
               log.error("2 BloqueoTotalHistoricoException "
                     + cadena.toString() + " " + e.getMessage());
               throw new DesbloqueoTotalException(e);
            } catch (RuntimeException e) {
               e.printStackTrace();
               log.error("2 RuntimeException " + e.getMessage());
               throw new DesbloqueoTotalException(
                     "Error inesperado en la gestión del desbloqueo "
                           + cadena.toString() + " " + e.getMessage());
            }
         }
      }
   }


}



The error condition

org.hibernate.PersistentObjectException: detached entity passed to persist:

Is there a workaround ?? Is it a hibernate bug???

I really do not know what i am doing wrong , please help!!!!! I have been trying to figure this out for hours to no avail.
Code:


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.