Hibernate

public void create(Tecnico tecnico) { SessionFactory sf = SessionFactoryHelper.getSessionFactory(); //Abrindo uma sessão Session session = sf.openSession(); Transaction transaction = session.beginTransaction(); //Iniciando uma transação session.save(tecnico); transaction.commit(); session.close(); }


Jun 10, 2011 7:28:55 PM org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): demo.bean.Tecnico
	at org.hibernate.id.Assigned.generate(Assigned.java:33)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
	at demo.controller.TecnicoJpaController.create(TecnicoJpaController.java:15)
	at demo.controller.TecnicoJpaController.main(TecnicoJpaController.java:26)

Alguém sabe o pq da Exception???

Que banco vc está usando? Setou ele como auto incremento?

MySQL sim esta como auto incremento.

O erro diz que você deve setar o ID manualmente, por isso perguntei se tinha setado o banco como auto-incremento.
Posta o seu mapeamento então, da classe Tecnico

[quote=romarcio]O erro diz que você deve setar o ID manualmente, por isso perguntei se tinha setado o banco como auto-incremento.
Posta o seu mapeamento então, da classe Tecnico [/quote]

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

package demo.bean;

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

/**
 *
 * @author Maiquqel */
@Entity
@Table(name = "tecnico")
@NamedQueries({
    @NamedQuery(name = "Tecnico.findAll", query = "SELECT t FROM Tecnico t"),
    @NamedQuery(name = "Tecnico.findByIdTecnico", query = "SELECT t FROM Tecnico t WHERE t.idTecnico = :idTecnico"),
    @NamedQuery(name = "Tecnico.findByNome", query = "SELECT t FROM Tecnico t WHERE t.nome = :nome"),
    @NamedQuery(name = "Tecnico.findByEmail", query = "SELECT t FROM Tecnico t WHERE t.email = :email")})
public class Tecnico implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idTecnico")
    private Integer idTecnico;
    @Basic(optional = false)
    @Column(name = "nome")
    private String nome;
    @Basic(optional = false)
    @Column(name = "email")
    private String email;

    public Tecnico() {
    }

    public Tecnico(Integer idTecnico) {
        this.idTecnico = idTecnico;
    }

    public Tecnico(Integer idTecnico, String nome, String email) {
        this.idTecnico = idTecnico;
        this.nome = nome;
        this.email = email;
    }

    public Integer getIdTecnico() {
        return idTecnico;
    }

    public void setIdTecnico(Integer idTecnico) {
        this.idTecnico = idTecnico;
    }

    public String getNome() {
        return nome;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

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

    @Override
    public String toString() {
        return "br.com.mnProgram.bean.Tecnico[idTecnico=" + idTecnico + "]";
    }

}

[code]package demo.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class SessionFactoryHelper {
private static final SessionFactory sessionFactory;

static {
    try {            
        /*
         * Build a SessionFactory object from session-factory configuration 
         * defined in the hibernate.cfg.xml file. In this file we register 
         * the JDBC connection information, connection pool, the hibernate 
         * dialect that we used and the mapping to our hbm.xml file for each 
         * POJO (Plain Old Java Object).
         * 
         */
    	   Configuration configuration = new AnnotationConfiguration();
           configuration.configure();
        sessionFactory = configuration.configure().buildSessionFactory();
    } catch (Throwable e) {
        System.err.println("Error in creating SessionFactory object." 
            + e.getMessage());
        throw new ExceptionInInitializerError(e);
    }
}

/*
 * A static method for other application to get SessionFactory object 
 * initialized in this helper class.
 * 
 */
public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

public static void main(String[] args) {
	System.out.println(SessionFactoryHelper.getSessionFactory());
}

}[/code]

A minha SessionFactory ta certa neh ???

Pode fazer assim:

    private static final SessionFactory sessionFactory; 

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration configuration = new AnnotationConfiguration();
            return configuration ().buildSessionFactory();
        } catch (Throwable e) {  
            System.err.println("Error in creating SessionFactory object."   
                + e.getMessage());  
            throw new ExceptionInInitializerError(e);  
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }

Não é bom fazer isso:

public void create(Tecnico tecnico) { SessionFactory sf = SessionFactoryHelper.getSessionFactory(); //Abrindo uma sessão Session session = sf.openSession(); Transaction transaction = session.beginTransaction(); //Iniciando uma transação session.save(tecnico); transaction.commit(); session.close(); }

Faça isso: public void create(Tecnico tecnico) { //Abrindo uma sessão Session session = SessionFactoryHelper.getSession(); Transaction transaction = session.beginTransaction(); //Iniciando uma transação session.save(tecnico); transaction.commit(); session.close(); }

Você precisa criar uma única SessionFactory, e a partir dela você cria varias Session.

Sobre o seu erro, não sei o que pode estar acontecendo. Se garante que o banco está auto-incremento, não sei o que pode ser.
Mas tenta trocar por @GeneratedValue(strategy = GenerationType.NATIVE)

Resolvido alterei

Isso

por isso

no Hibernate.cfg.xml

Obrigado pela Ajuda…

[quote=MaiqueL]Resolvido alterei

Isso

por isso

no Hibernate.cfg.xml

Obrigado pela Ajuda…[/quote]

Funcionou pra mim tb, cara! depois de 2 dias procurando uma solução!