Erro ao salvar usuario _ com Hibernate

2 respostas
J

Pessoal,
Fui tentar salvar meu objeto usuario agora e me deu erro, estranho porque estava funcionando.
O erro é esse:

HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class catalogo.controle.UsuarioControle
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:619)

root cause

java.lang.ExceptionInInitializerError
catalogo.util.HibernateUtil.(HibernateUtil.java:19)
catalogo.controle.UsuarioControle.(UsuarioControle.java:19)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:619)

root cause

org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: catalogo.modelo.Usuario.tipoUsuarioCodigo in catalogo.modelo.TipoUsuario.usuarioCollection
org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:576)
org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:541)
org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:324)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
catalogo.util.HibernateUtil.(HibernateUtil.java:14)
catalogo.controle.UsuarioControle.(UsuarioControle.java:19)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
java.lang.Class.newInstance0(Class.java:355)
java.lang.Class.newInstance(Class.java:308)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
java.lang.Thread.run(Thread.java:619)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs

Meu servlet esta assim:

package catalogo.controle;

import catalogo.dao.GenericDAO;
import catalogo.dao.UsuarioDAO;
import catalogo.modelo.Usuario;
import catalogo.util.HibernateUtil;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class UsuarioControle extends HttpServlet {

    private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    private Session session = HibernateUtil.getSession();
    Transaction transaction = session.beginTransaction();
    private Usuario usuario;
    private UsuarioDAO usuarioDao;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    } 

    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String login = request.getParameter("login");
            String senha = request.getParameter("senha");
            String nome  = request.getParameter("nome");
            String tipo  = request.getParameter("tipo");

            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet UsuarioControle</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("Login: " + login + "<br />");
            out.println("Senha: " + senha + "<br />");
            out.println("Nome: "  + nome + "<br />");
            out.println("Tipo: "  + tipo + "<br />");
            out.println("</body>");
            out.println("</html>");

            try {
                usuario = new Usuario();
                usuario.setLogin(login);
                usuario.setSenha(senha);
                usuario.setNome(nome);
                //usuario.setTipoUsuarioCodigo(null);

                GenericDAO dao = new GenericDAO(session, Usuario.class);
                dao.Salvar(usuario);
                transaction.commit();
            }
            catch (Exception e) {
                out.println("Nao salvou!" + e.getMessage());
            }
            finally {
                session.flush();
                session.close();
            }
        }
        finally {
            out.close();
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

Meu GenericDAO:

package catalogo.dao;

import java.util.List;
import org.hibernate.Session;

public class GenericDAO<X> {

    private Class persistentClass;
    protected Session session;

    public GenericDAO(Session session, Class persistentClass) {
        this.session = session;
        this.persistentClass = persistentClass;
    }

    public void Salvar(X x) {
        session.save(x);
    }
...
}

Estou encontrando dificultades para salvar o tipo de usuario, pois no BD esta como inteiro e na minha entidade usuario esta como TipoUsuario(objketo), por isso esta comentado no codigo, se precisarem de mais alguma codigo me avisem, por favor. Acho que minah entidade e meu hibernate.cfg.xml, estao corretos por isso nao os postei

2 Respostas

Paulo_Silveira

Ola!

De acordo com essa mensagem:
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: catalogo.modelo.Usuario.tipoUsuarioCodigo in catalogo.modelo.TipoUsuario.usuarioCollection

O erro está no seu mapeamento. Voce pode postar a classe Usuario e a classe TipoUsuario. Creio que, em cima do seu usuarioCollection, o @ManyToMany deveria ter mappedBy=“tipoUsuario” (o nome da propriedade) e nao “tipoUsuarioCodigo” (o nome da chave estrangeira), conforme ele acusa.

abracos

J

As minhas entidades foram geradas automaticamente pelo NetBeans,a partir das minhas tabelas do BD, porém estou com bastante duvida com esses relacionamentos sim. Na minha tabela usuario tem um campo tipo_usuario_codigo, que é do tipo int e esta ligado ao campo codigo da tabela tipoUsuario, a duvida maior é como persistir meu objeto usuario, sendo que tenho um campo int na tabela e meu objeto esta esperando outro objeto do tipo TipoUsuario?
Deu pra entender?

Minha classe Usuario está assim:

package catalogo.modelo;

import java.io.Serializable;
import javax.persistence.Basic;
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.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "usuario", schema = "catalogo")
@NamedQueries({
    @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u")})
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;

    @Basic(optional = false)
    @Column(name = "login", nullable = false, length = 45)
    private String login;

    @Basic(optional = false)
    @Column(name = "senha", nullable = false, length = 45)
    private String senha;

    @Column(name = "nome", length = 45)
    private String nome;

    //@JoinColumn(name = "tipo_usuario_codigo", referencedColumnName = "codigo", nullable = true)
    //@ManyToOne(optional = false)
    //private TipoUsuario tipoUsuarioCodigo;

    public Usuario() {
    }

    public Usuario(Integer codigo) {
        this.codigo = codigo;
    }

    public Usuario(Integer codigo, String login, String senha) {
        this.codigo = codigo;
        this.login = login;
        this.senha = senha;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

   /* public TipoUsuario getTipoUsuarioCodigo() {
        return tipoUsuarioCodigo;
    }

    public void setTipoUsuarioCodigo(TipoUsuario tipoUsuarioCodigo) {
        this.tipoUsuarioCodigo = tipoUsuarioCodigo;
    }*/

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.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 Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "catalogo.modelo.Usuario[codigo=" + codigo + "]";
    }

}

TipoUsuario:

package catalogo.modelo;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "tipo_usuario", schema = "catalogo")
@NamedQueries({
    @NamedQuery(name = "TipoUsuario.findAll", query = "SELECT t FROM TipoUsuario t")})
public class TipoUsuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codigo", nullable = false)
    private Integer codigo;
    @Basic(optional = false)
    @Column(name = "tipo", nullable = true, length = 45)//nullable false depois
    private String tipo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoUsuarioCodigo")
    private Collection<Usuario> usuarioCollection;

    public TipoUsuario() {
    }

    public TipoUsuario(Integer codigo) {
        this.codigo = codigo;
    }

    public TipoUsuario(Integer codigo, String tipo) {
        this.codigo = codigo;
        this.tipo = tipo;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getTipo() {
        return tipo;
    }

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

    public Collection<Usuario> getUsuarioCollection() {
        return usuarioCollection;
    }

    public void setUsuarioCollection(Collection<Usuario> usuarioCollection) {
        this.usuarioCollection = usuarioCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.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 TipoUsuario)) {
            return false;
        }
        TipoUsuario other = (TipoUsuario) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "catalogo.modelo.TipoUsuario[codigo=" + codigo + "]";
    }

}
Criado 5 de fevereiro de 2010
Ultima resposta 6 de fev. de 2010
Respostas 2
Participantes 2