Problema de id no hibernate

Olá pessoal… to tendo um problema na hora de dá um insert que realmente não consigo enteder… o hibernate não está salvando nos campos corretos, olhas as classes seguinte…

Esse é servlet básico:

package com.rs.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.rs.bo.UsuarioBo;
import com.rs.dto.UsuarioDTO;

@WebServlet("/Cadastro")
public class CadastroServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public CadastroServlet() {
        super();
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		UsuarioDTO dto = new UsuarioDTO();
		UsuarioBo bo = new UsuarioBo();
		dto.setLogin(request.getParameter("login"));
		dto.setPassword(request.getParameter("password"));
		if (bo.inserir(dto)){
			response.sendRedirect("home.html");
		} else {
			response.sendRedirect("error.html");
		}
			
		
	}
	
	}

Essa é DAO:

package com.rs.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.rs.dto.UsuarioDTO;
import com.rs.factory.ConexaoHiber;
import com.rs.factory.DAO;

public class UsuarioDAO extends DAO {

        private Session session;

	public boolean inserir(UsuarioDTO usuario) {
        session = ConexaoHiber.getInstance();
        Transaction tx = null; 

        try{
            tx = session.beginTransaction();
            session.save(usuario);
            
            tx.commit();
            return true;
        }catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally{
            session.close();
        }
        return false;
	}


}

DTO:

package com.rs.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="usuario")
public class UsuarioDTO {
	
	@Id
	@GeneratedValue
	private long id;
	
	@Column(name="login", nullable=false)
	private String login;
	
	@Column(name="password", nullable=false)
	private String password;
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public UsuarioDTO(String login, String password){
		this.login = login;
		this.password = password;
		
		
	}
	
	public UsuarioDTO(){
		
	}

}

BO:

package com.rs.bo;

import com.rs.dao.UsuarioDAO;
import com.rs.dto.UsuarioDTO;

public class UsuarioBo {
	
	private UsuarioDAO dao;
	
	public UsuarioBo(){
		dao = new UsuarioDAO();
	}
	
	public boolean inserir(UsuarioDTO usuario){
		return dao.inserir(usuario);
	}

}

eu tenho um campo id, login e password… mais o problema é que ele joga o que está no login pra dentro do id e o password pra dentro do login… e o password fica vazio… alguém sabe o que seria???

Obrigado desde já!!!

Olá Boa Noite!

Aparentemente o seu código está correto. Qual banco você está usando? Bom, existem algumas tentativas para ser feitas a fim de descobrir o que está causando o problema:

Tenta mudar no Servlet para ele setar no objeto dto valores fixos, ao invés dos que estão vindo pelo POST…

dto.setLogin("teste"); dto.setPassword("abc");

Se der certo, o problema está no POST…

Se não resolver, tenta ali só para testar, setar um código pro objeto:

dto.setId(90); dto.setLogin(request.getParameter("login")); dto.setPassword(request.getParameter("password"));

Se funcionar, você precisa definir tipo de estratégia para a geração do Id…

package com.rs.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="usuario")
public class UsuarioDTO {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;

Ou ainda, mude o tipo long para Long desse atributo id…

Se não der certo de nenhuma das formas, informe o SGBD q vc está usando e se possível cole o código SQL de geração da tabela tbm…

Abraço

Paulo Roberto Balmer

To usando postgresql e comando que usei pra criar a tabela seria CREATE DATABASE usuario (id character varying(80) primary key not null, login varchar(80), password varchar(80));

eu fiz o que vc pediu e não mudou nada… to achando muito estranho isso…

Tenta criar o ID como SERIAL no postgresql, e anotar o @GeneratedValue assim:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=“usuario_seq”)

Cuidado para colocar ali em “usuario_seq” o nome da sequencia que o postgresql vai criar pra sua tabela…

Isso deve resolver…

Fiz como o cara acima citou… criando como serial o campo passar a ser do tipo integer… dae alterei a id da dto pra integer tb… dae surge o seguinte problema:

org.postgresql.util.PSQLException: ERRO: coluna “id” é do tipo integer mas expressão é do tipo character varying
Dica: Você precisará reescrever ou converter a expressão.
Posição: 28

=s