[Hibernate] Erro na persistencia "Incorrect integer value: '’' for column"

4 respostas
E

Boa noite, não sei mais o que fazer, quando tento salvar uma cidade aparece o seguinte erro:

Hibernate: select max(id_cidade) from cidade
Hibernate: insert into cidade (nome, estado, id_cidade) values (?, ?, ?)
6061 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1366, SQLState: HY000
6061 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Incorrect integer value: ‘¬í’ for column ‘ESTADO’ at row 1
6061 [AWT-EventQueue-0] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session

Aí vao as minhas classes:

Cidade

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 = "cidade")
@NamedQueries({
    @NamedQuery(name = "Cidade.findAll", query = "SELECT c FROM Cidade c")})
public class Cidade implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_CIDADE")
    private Integer idCidade;
    @Column(name = "NOME")
    private String nome;
    @JoinColumn(name = "ESTADO", referencedColumnName = "ID_ESTADO")
    @ManyToOne(optional = false)
    private Estado estado;

    public Cidade() {
    }

    public Cidade(Integer idCidade) {
        this.idCidade = idCidade;
    }

   //Getters and setters

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

    @Override
    public String toString() {
        return "idCidade=" + idCidade + "]";
    }

}

CidadeDAO

import java.util.Collection;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;

public class CidadeDAO {

    private SessionFactory factory;

    public CidadeDAO() throws Exception {
        factory = new Configuration().configure().buildSessionFactory();
    }
    
    public void insere(Cidade cidade) throws Exception {
        Session session = factory.getCurrentSession();
        session.beginTransaction();
        session.save(cidade);
        session.getTransaction().commit();
        session.flush();
    }
}

Estado

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 = "estado")
@NamedQueries({
    @NamedQuery(name = "Estado.findAll", query = "SELECT e FROM Estado e")})
public class Estado implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_ESTADO")
    private Integer idEstado;
    @Column(name = "UF")
    private String uf;
    @Column(name = "NOME")
    private String nome;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "estado")
    private Collection<Cidade> cidadeCollection;

    public Estado() {
    }

    public Estado(Integer idEstado) {
        this.idEstado = idEstado;
    }

    //Getters and setters

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

    @Override
    public String toString() {
        return this.getUf();
    }

}

EstadoDAO

import java.util.Collection;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;

public class EstadoDAO {

    private SessionFactory factory;

    public EstadoDAO() throws Exception {
        factory = new Configuration().configure().buildSessionFactory();
    }

    public Estado buscaPorId(int pk) throws Exception {
        Session session = factory.openSession();
        Estado estado = (Estado) session.get(Estado.class, pk);
        session.flush();
        return estado;
    }
}

E finalmente o código que eu uso para buscar e salvar

try {
            Cidade cidade = new Cidade();
            cidade.setNome("Curitiba");
            cidade.setEstado(new EstadoDAO().buscaPorId(1)); // Este estado existe e está cadastrado no banco
            CidadeDAO cDao = new CidadeDAO();
            cDao.insere(cidade);
        } catch (Exception e) {
            e.printStackTrace();
        }

4 Respostas

E

Cidade.hbm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="Cidade" table="cidade">
    <id column="id_cidade" name="idCidade" type="integer">
      <generator class="increment"/>
    </id>
    <property column="nome" name="nome" type="string"/>
    <property column="estado" name="estado" type="Estado"/>
  </class>
</hibernate-mapping>

Estado.hbm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="Estado" table="estado">
    <id column="id_estado" name="idEstado" type="integer">
      <generator class="increment"/>
    </id>
    <property column="uf" name="uf" type="string"/>
    <property column="nome" name="nome" type="string"/>
  </class>
</hibernate-mapping>

hibernate.cfg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/cwg</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">teste</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
    <mapping resource="Cidade.hbm.xml"/>
    <mapping resource="Estado.hbm.xml"/>
    <mapping resource="Funcionario.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
romarcio

Acho que o problema é o seguinte.

Vc tem na classe Cidade um atributo estado do tipo Estado, e parece que está tentando inserir nele na hora de salvar um Integer.

Vc tem que inserir um estado e não um integer.

E

Mas todos os tipos relacionados a Estado são Estado, incluindo o atributo Estado de Cidade.

Não entendi!

E

Problema resolvido!

No arquivo de mapeamento de Cidade, troquei a linha

por

Vlw, pela atenção pessoal :wink:

Criado 11 de setembro de 2010
Ultima resposta 12 de set. de 2010
Respostas 4
Participantes 2