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)
[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!