5 Replies Latest reply: Oct 1, 2008 1:15 PM by jschellSomeoneStoleMyAlias RSS

    Query result : Object to DTO : ClassCastException

    805008
      hi, my problem is: im using persistence.xml, entity class from db, a controller of persistence class, and my jsp to get the data result in browser, deploy the first time it works fine, but i add something to my code and deploy again and i get ClassCastException when parsing the Object result of the Query to my EmpresasDTO.

      look:

      this is my persistence.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
        <persistence-unit name="SecureFilePU" transaction-type="JTA">
          <jta-data-source>jdbc/SecureFileDB</jta-data-source>
          <class>co.com.itac.securefile.persistence.dto.CamposDTO</class>
          <class>co.com.itac.securefile.persistence.dto.DiasEspecialesDTO</class>
          <class>co.com.itac.securefile.persistence.dto.EmpresasDTO</class>
          <class>co.com.itac.securefile.persistence.dto.EstadoCargaDTO</class>
          <class>co.com.itac.securefile.persistence.dto.EstadoDescargaDTO</class>
          <class>co.com.itac.securefile.persistence.dto.HorarioDTO</class>
          <class>co.com.itac.securefile.persistence.dto.HorariosDTO</class>
          <class>co.com.itac.securefile.persistence.dto.LogsDTO</class>
          <class>co.com.itac.securefile.persistence.dto.ParametrosDTO</class>
          <class>co.com.itac.securefile.persistence.dto.TipoUsuarioDTO</class>
          <class>co.com.itac.securefile.persistence.dto.UsuariosDTO</class>
          <exclude-unlisted-classes>true</exclude-unlisted-classes>
          <properties>
            <property name="toplink.ddl-generation" value="create-tables"/>
          </properties>
        </persistence-unit>
      </persistence>
      (continue)
        • 1. Re: Query result : Object to DTO : ClassCastException
          805008
          This is my entity class from the db:
          package co.com.itac.securefile.persistence.dto;
          
          import java.io.Serializable;
          import java.util.Collection;
          import javax.persistence.*;
          
          /**
           * @author marlon
           */
          @Entity
          @Table(name = "empresas")
          @NamedQueries({@NamedQuery(name = "EmpresasDTO.findById", query = "SELECT e FROM EmpresasDTO e WHERE e.id = :id"),
            @NamedQuery(name = "EmpresasDTO.findAll", query = "SELECT e FROM EmpresasDTO e")
          })
          public class EmpresasDTO implements Serializable {
          
            private static final long serialVersionUID = 2L;
            @Id
            @Column(name = "id", nullable = false)
            private Integer id;
            @Column(name = "nombre", nullable = false)
            private String nombre;
            @Column(name = "campo1")
            private String campo1;
            @OneToMany(cascade = CascadeType.ALL, mappedBy = "idEmpresa")
            private Collection<EstadoCargaDTO> estadoCargaDTOCollection;
            @OneToMany(cascade = CascadeType.ALL, mappedBy = "idEmpresa")
            private Collection<EstadoDescargaDTO> estadoDescargaDTOCollection;
            @OneToMany(cascade = CascadeType.ALL, mappedBy = "idEmpresa")
            private Collection<UsuariosDTO> usuariosDTOCollection;
          
            public EmpresasDTO() {
            }
          
            public EmpresasDTO(Integer id) {
              this.id = id;
            }
          
            public EmpresasDTO(Integer id, String nombre) {
              this.id = id;
              this.nombre = nombre;
            }
          
            public Integer getId() {
              return id;
            }
          
            public void setId(Integer id) {
              this.id = id;
            }
          
            public String getNombre() {
              return nombre;
            }
          
            public void setNombre(String nombre) {
              this.nombre = nombre;
            }
          
            public String getCampo1() {
              return campo1;
            }
          
            public Collection<EstadoCargaDTO> getEstadoCargaDTOCollection() {
              return estadoCargaDTOCollection;
            }
          
            public void setEstadoCargaDTOCollection(Collection<EstadoCargaDTO> estadoCargaDTOCollection) {
              this.estadoCargaDTOCollection = estadoCargaDTOCollection;
            }
          
            public Collection<EstadoDescargaDTO> getEstadoDescargaDTOCollection() {
              return estadoDescargaDTOCollection;
            }
          
            public void setEstadoDescargaDTOCollection(Collection<EstadoDescargaDTO> estadoDescargaDTOCollection) {
              this.estadoDescargaDTOCollection = estadoDescargaDTOCollection;
            }
          
            public Collection<UsuariosDTO> getUsuariosDTOCollection() {
              return usuariosDTOCollection;
            }
          
            public void setUsuariosDTOCollection(Collection<UsuariosDTO> usuariosDTOCollection) {
              this.usuariosDTOCollection = usuariosDTOCollection;
            }
          
            @Override
            public int hashCode() {
              int hash = 0;
              hash += (id != null ? id.hashCode() : 0);
              return hash;
            }
          
            @Override
            public boolean equals(Object object) {
              // TODO: Warning - this method won't work in the case the id fields are not set
              if (!(object instanceof EmpresasDTO)) {
                return false;
              }
              EmpresasDTO other = (EmpresasDTO) object;
              if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
              }
              return true;
            }
          
            @Override
            public String toString() {
              return "co.com.itac.securefile.persistence.dto.EmpresasDTO[id=" + id + "]";
            }
          }
          in my PersistenceController:
            public EmpresasDTO consultarEmpresa(Integer id) {
              obtenerEntityManager();
              try {
                
                Query consulta = em.createNamedQuery("EmpresasDTO.findById");
                consulta.setParameter("id", id);
                EmpresasDTO respuesta = (EmpresasDTO) consulta.getSingleResult();
                return respuesta;
              } finally {
                em.close();
              }
            }
          ERROR Result:
          Caused by: java.lang.ClassCastException
               at java.lang.Class.cast(Class.java:2951)
               at co.com.itac.securefile.persistence.controller.ControladoraPersistencia.consultarEmpresas(ControladoraPersistencia.java:204)
               at co.com.itac.securefileserveradmin.AdminSessionBean.inicializaListaEmpresas(AdminSessionBean.java:142)
               at co.com.itac.securefileserveradmin.portal.empresas.ConsultaEmpresas.prerender(ConsultaEmpresas.java:143)
               at com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.prerender(ViewHandlerImpl.java:806)
               at com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.renderView(ViewHandlerImpl.java:303)
               ... 39 more
          |#]
          thnaks x the help.
          • 2. Re: Query result : Object to DTO : ClassCastException
            805008
            when i restart glassfish, works fine the first time run application, the second deploy crash.
            i HAVE to restart glassfish everytime i do changes :(
            • 3. Re: Query result : Object to DTO : ClassCastException
              jschellSomeoneStoleMyAlias
              I suggest that you print out the type of the class before the cast.
              • 4. Re: Query result : Object to DTO : ClassCastException
                805008
                jschell, that was the first i did, when the Object Query results i ask if(Object instanceof EmpresaDTO) it returns false, else{ print out Object.getClass and EmpresaDTO.class } and i get: co.com.itac.securefile.persistence.EmpresaDTO in both cases. what is wrong?.
                • 5. Re: Query result : Object to DTO : ClassCastException
                  jschellSomeoneStoleMyAlias
                  i get: co.com.itac.securefile.persistence.EmpresaDTO in both cases. what is wrong?.
                  Simple. The explanation for that sort of result is always the same.

                  There are two different classloaders involved. You can figure out which ones via the 'class'
                  of each although that probably won't help you much. Your solution will probably revolve
                  around configuration and or packaging (how you put the classes together.)