[RESOLVIDO]Hibernate, Erro em um Crud Simples

11 respostas
darksteel3000

Ola amigos estou aqui denovo com um problema em um CRUD no hibernate q estou tentando fazer.

QUando tento cadastrar da um erro dizendo: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.com.negocio.Endereco

Aqui vai as minhas classes de criação do crud:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dados.hibernate;

import br.com.negocio.Aluno;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 *
 * @author Júnior
 */
public class AlunoDAO {


    private SessionFactory factory;

    public AlunoDAO(){
    this.factory = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    public void inserirAluno(Aluno aluno){
        Session session = this.factory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(aluno);
        session.flush();
        tx.commit();
        session.close();

    }

    public boolean existe(String cpf, String tipo){
        Session session = this.factory.openSession();
        Aluno aluno = (Aluno) session.get(Aluno.class, cpf);
        boolean exi = session.contains(aluno);
        session.flush();
        session.close();
        return exi;
    }

    public void removerAluno(String cpf){
        Session session = this.factory.openSession();
        Aluno alu = (Aluno) session.get(Aluno.class, cpf);
        Transaction tx = session.beginTransaction();
        session.delete(alu);
        session.flush();
        tx.commit();
        session.close();
    }

    public Aluno procurarAluno(String cpf){

         Session session = this.factory.openSession();
         Aluno aluno = (Aluno) session.get(Aluno.class, cpf);
         session.flush();
         //session.close();
         return aluno;

    }

    public void atualizarAluno(Aluno aluno){

        Session session = this.factory.openSession();
        Transaction tx = session.beginTransaction();
        session.update(aluno);
        session.flush();
        tx.commit();
        session.close();
    }

}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dados.hibernate;

import br.com.negocio.Aluno;
import br.com.negocio.IRepositorioAlunos;
import java.sql.SQLException;

/**
 *
 * @author Júnior
 */
public class RepositorioAlunosHibernate implements IRepositorioAlunos {

    private AlunoDAO alunoDao;

    public RepositorioAlunosHibernate() {
        this.alunoDao = new AlunoDAO();
    }

    public void inserir(Aluno aluno) throws SQLException {
        alunoDao.inserirAluno(aluno);
    }

    public void remover(String cpf) throws SQLException {
        alunoDao.removerAluno(cpf);
    }

    public boolean existe(String cpf, String tipo) throws SQLException {
        return alunoDao.existe(cpf, tipo);
    }

    public Aluno procurar(String cpf) throws SQLException {
        return alunoDao.procurarAluno(cpf);
    }

    public void atualizar(Aluno aluno) throws SQLException {
        alunoDao.atualizarAluno(aluno);
    }

}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dados.hibernate;

import br.com.negocio.Professor;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 *
 * @author Júnior
 */
public class ProfessorDAO {

    private SessionFactory factory;

    public ProfessorDAO(){
    this.factory = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    public void inserirProfessor(Professor professor){
        Session session = this.factory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(professor);
        session.flush();
        tx.commit();
        session.close();

    }

    public boolean existe(String cpf, String tipo){
        Session session = this.factory.openSession();
        Professor professor = (Professor) session.get(Professor.class, cpf);
        boolean exi = session.contains(professor);
        session.flush();
        session.close();
        return exi;
    }

    public void removerProfessor(String cpf){
        Session session = this.factory.openSession();
        Professor pro = (Professor) session.get(Professor.class, cpf);
        Transaction tx = session.beginTransaction();
        session.delete(pro);
        session.flush();
        tx.commit();
        session.close();
    }

    public Professor procurarProfessor(String cpf){

         Session session = this.factory.openSession();
         Professor Professor = (Professor) session.get(Professor.class, cpf);
         session.flush();
         //session.close();
         return Professor;

    }

    public void atualizarProfessor(Professor professor){

        Session session = this.factory.openSession();
        Transaction tx = session.beginTransaction();
        session.update(professor);
        session.flush();
        tx.commit();
        session.close();
    }

}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dados.hibernate;

import br.com.negocio.IRepositorioProfessores;
import br.com.negocio.Professor;
import java.sql.SQLException;

/**
 *
 * @author Júnior
 */
public class RepositorioProfessoresHibernate implements IRepositorioProfessores{

    private ProfessorDAO professorDao;

    public RepositorioProfessoresHibernate() {
        this.professorDao = new ProfessorDAO();
    }

    public void inserir(Professor professor) throws SQLException {
        professorDao.inserirProfessor(professor);
    }

    public void remover(String cpf) throws SQLException {
        professorDao.removerProfessor(cpf);
    }

    public boolean existe(String cpf, String tipo) throws SQLException {
        return professorDao.existe(cpf, tipo);
    }

    public Professor procurar(String cpf) throws SQLException {
        return professorDao.procurarProfessor(cpf);
    }

    public void atualizar(Professor professor) throws SQLException {
        professorDao.atualizarProfessor(professor);
    }

}
E a minha classe de Endereço Mapeada
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.negocio;

import java.io.Serializable;
import javax.persistence.*;

/**
 *
 * @author Júnior
 */
@Entity
@Table(name="endereco")
public class Endereco implements Serializable{

    @Id
    @Column(name="cpf")
    
    private String cpf;

    @Column
    private String cep;
    @Column
    private String numero;
    @Column
    private String complemento;

    public Endereco(String cep, String numero, String complemento) {
        this.cep = cep;
        this.numero = numero;
        this.complemento = complemento;
    }

    public Endereco(String cpf, String cep, String numero, String complemento) {
        this.cpf = cpf;
        this.cep = cep;
        this.numero = numero;
        this.complemento = complemento;
    }

    

    public Endereco(){
        
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

}

Ajudem Please !!!

11 Respostas

T

Seu Erro está aqui!

@Entity
@Table(name="endereco")
public class Endereco implements Serializable{

    @Id
    @Column(name="cpf")
    
    private String cpf;
...

o @Id só pode ser do tipo int ou long.

darksteel3000

Consertei aquele trco la, mais ve so agora ta dando ese erro, onde nem inicia o Frame

T

Disciplina está mapeado no arquivo XML?

darksteel3000
<?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/projetoqualiti</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    
    <mapping class="br.com.negocio.Aluno"/>
    <mapping class="br.com.negocio.Endereco"/>
    <mapping class="br.com.negocio.Professor"/>
    <mapping class="br.com.negocio.Disciplina"/>
    <mapping class="br.com.negocio.Pessoa"/>
    
  </session-factory>
</hibernate-configuration>
darksteel3000

Olha só eu tenho uma classe PEssoa ( Abstrata ), onde ela é herdada por outras duas classes ( Aluno e Professor ). Tanto aluno quanto professor tem q ter um atributo collection do tipo Disciplinas, onde esse atributo eu coloquei em pessoa para os dois terem acesso. Queres o Codigo desses 4? Abração !!!

darksteel3000

Pelo que vejo o erro em base ta em disciplinas, ve so a classe:

Exception in thread "main" org.hibernate.MappingException: Repeated column in mapping for entity: br.com.negocio.Disciplina column: cpf (should be mapped with insert="false" update="false")
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.negocio;

import javax.persistence.*;
import java.io.Serializable;

/**
 *
 * @author Júnior
 */

@Entity
@Table(name="disciplina")
public class Disciplina implements Serializable{


    @Id
    @Column
    private String cpf;

    @Column(name="codigo_disciplina")
    private String codigo;

    @Column(name="nome_disciplina")
    private String nome;

    @Column(name="carga_horaria")
    private String cargaHoraria;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name= "cpf")
    private Professor professor;
    private Aluno aluno;

//    @ManyToOne(fetch = FetchType.EAGER)
//    @JoinColumn(name= "cpf")
    


    public Disciplina(String codigo, String nome, String cargaHoraria) {
        this.codigo = codigo;
        this.nome = nome;
        this.cargaHoraria = cargaHoraria;
    }

    public Disciplina(String cpf, String codigo, String nome, String cargaHoraria) {
        this.cpf = cpf;
        this.codigo = codigo;
        this.nome = nome;
        this.cargaHoraria = cargaHoraria;
    }

    public Disciplina(String cpf, String codigo, String nome, String cargaHoraria, Professor professor, Aluno aluno) {
        this.cpf = cpf;
        this.codigo = codigo;
        this.nome = nome;
        this.cargaHoraria = cargaHoraria;
        this.professor = professor;
        this.aluno = aluno;
    }

    

    public Disciplina() {
    }

    public String getCargaHoraria() {
        return cargaHoraria;
    }

    public void setCargaHoraria(String cargaHoraria) {
        this.cargaHoraria = cargaHoraria;
    }

    public String getCodigo() {
        return codigo;
    }

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

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

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

}
R

@darksteel3000: a mensagem “ids for this class must be manually assigned before calling save()” indica que você tentou salvar uma instância da classe sem preencher o ID. Como o ID estava vazio, e você não definiu nenhum estratégia para o Hibernate gerar o ID automaticamente, a tentativa de gravação falhou. Já a mensagem “Repeated column in mapping for entity” indica que a mesma coluna de uma tabela está sendo mapeada para mais de um atributo da mesma classe - nesse caso, apenas um dos mapeamentos poderá ter contexto de leitura e gravação, os outros devem ter seu contexto definido como somente leitura via insert=“false” update=“false”.

@two_: o Hibernate dá suporte a ID’s cujo tipo não é Int ou Long, é preciso apenas que você preencha o ID corretamente. No caso do darksteel, ele teria que preencher o ID explicitamente ou usar uma GUID fornecida pelo SGBD.

darksteel3000

Ola amigo, entendi sua explicação, mais como nunca trabalhei com hibernate estou voando aqui, podes me ajudar? Abraços !!! E meu bd não pode ser modificado !!!

darksteel3000

Resolvi o da repetição, mais como vou preencher o cpf automaticamente, supondo q ta mais do que errado o cpf automatico.

R

Você vai ter que preencher o CPF explicitamente antes de gravar a instância:

objeto.setCpf("[telefone removido]");
session.save(objeto);
darksteel3000

Humm, então no caso poderei mandar como parametro o cpf, e quando chamar o form mando ele pegar o valor do cpf, pq seria mais legal colocar dinamicamente.

Criado 5 de fevereiro de 2011
Ultima resposta 5 de fev. de 2011
Respostas 11
Participantes 3