Hibernate "identity value" Anotações (RESOLVIDOOO)

Olá, estou aprendendo a usar o hibernate seguindo um tutorial que cria uma classe de cadastro de aluno, porém estou me deparando com um erro que está relacionado ao BD.
A seguir estão as duas classes e o erro que foi criado, também tem o script que utilizei para criar a tabela no banco de dados.
O erro reclama que não consegui incrementar a coluna da chave primaria no BD…se eu tirar a anotação @Column continua dando o mesmo erro, sei que esta pro ai o erro, mas não tenho ideia do que fazer mais!..
espero que possam me ajudar!
Atenciosamente… :smiley:

[code]package inicio_alunos;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

//Anotação que informa que a classe mapeada é persistente
@Entity
//Informando nome e esquema da tabela mapeada
@Table(name=“aluno”, schema=“anotacoes”)
public class Aluno {
// Definição do mecanismo de definição da chave primária
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
// Informa o nome da coluna mapeada para o atributo
@Column(name=“id_aluno”)
private int id;

private int matricula;
private String nome;
private int cpf;

// Construtor padrão
public Aluno(){}
// Métodos getters e setters
public int getCpf()
{ return cpf; }

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

public int getId() 
{return id; }

public void setId(int id) 
{ this.id = id; }

public int getMatricula()
{ return matricula; }

public void setMatricula(int matricula) 
{this.matricula = matricula;}

public String getNome()
{ return nome; }

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

}[/code]

[code]package inicio_alunos;

//Imports de elementos para o uso do Hibernate funcionar
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
//Import da classe de domínio persistida
import inicio_alunos.Aluno;
public class Inicio {
public static void main(String[] args) {
//Cria objeto que receberá as configurações
Configuration cfg = new AnnotationConfiguration();
//Informe o arquivo XML que contém a configurações
cfg.configure("/inicio_alunos/hibernate.cfg.xml");
//Cria uma fábrica de sessões.
//Deve existir apenas uma instância na aplicação
SessionFactory sf = cfg.buildSessionFactory();
//Abre sessão com o Hibernate
Session session = sf.openSession();
//Cria uma transação
Transaction tx = session.beginTransaction();
//Cria objeto Aluno
Aluno aluno = new Aluno();
aluno.setNome(“Rala”);
aluno.setMatricula(033);
aluno.setCpf(128);
session.save(aluno); // Realiza persistência

tx.commit(); // Finaliza transação
session.close(); // Fecha sessão
}
}
[/code]

#####ERRO GERADO

[code]log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
insert
into
anotacoes.aluno
(cpf, matricula, nome)
values
(?, ?, ?)
Exception in thread “main” org.hibernate.HibernateException: The database returned no natively generated identity value
at org.hibernate.id.IdentifierGeneratorFactory.getGeneratedIdentity(IdentifierGeneratorFactory.java:33)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:74)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
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 inicio_alunos.Inicio.main(Inicio.java:29)

[/code]

###ARQUIVO hibernate.cfg.xml

[code]<?xml version="1.0" encoding="utf-8"?>

com.mysql.jdbc.Driver jdbc:mysql://localhost/guiserver org.hibernate.dialect.MySQLDialect true root 123456 10 [/code]

CREATE TABLE anotacoes.aluno ( id int, -- Identificador da tabela matricula int, -- Matrícula do aluno nome char(8) , -- Nome do aluno cpf int, -- CPF do aluno PRIMARY KEY (id) )

O campo “id_aluno” da tabela precisa ser auto incremente o que eu não vi no seu script. Estou te mandando a notação do autogenereted:

@GeneratedValue(strategy=GenerationType.AUTO)

Ops.: mais uma coisa vc não precisa do @Column(name=“id_aluno”), pois o nome na tabele do campo é o mesmo do atributo da classe.

Abços,

“Mikas”

Se nao me engano, pro Identity funcionar voce precisa colocar um valor default na sua coluna da PK. Experimente mudar a estrategia de geracao de chave e ve se funciona.

[quote=jamikas]O campo “id_aluno” da tabela precisa ser auto incremente o que eu não vi no seu script. Estou te mandando a notação do autogenereted:

@GeneratedValue(strategy=GenerationType.AUTO)

Ops.: mais uma coisa vc não precisa do @Column(name=“id_aluno”), pois o nome na tabele do campo é o mesmo do atributo da classe.

Abços,

“Mikas”[/quote]

então! eu jah tinha tentado por este tipo de estrategia .AUTO, e mesmo agora tb com .AUTO continua retornando o mesmo erro…e em relação ao id_aluno eh que eu tinha alterado, como vi que o erro era em relação ao a identificação mudei no banco de dados e tirei o @Column…mas agora a tabela no banco estah id_aluno…
mais alguma dica??? :oops: :oops: :slight_smile:

[quote]nicholas.bittencourt 01/08/2007 09:49:09 Assunto:

Se nao me engano, pro Identity funcionar voce precisa colocar um valor default na sua coluna da PK. Experimente mudar a estrategia de geracao de chave e ve se funciona.
[/quote]
esse valor default que vc fiz eh deixar ele com alguma linha lah iniciando com o valor 0 ou 1?? se for isso tb jah tentei…e nao adiantou…
o que fiz foi criar diretamento no banco um aluno com PK value = ‘0’ e outro com value = ‘1’…mas nao adiantou tb…

mais alguma dica??? :oops: :oops: :slight_smile:

vc colocou o campo na tabela do mysql para ser auto incrementado?

abços,

“MIKAS”

uhnn…isso eu nao tentei! vou tentar assim que chegar em ksa hoje de noite! mas pelo visto tem uma grande chance de ser…
mto obrigado mesmo…
abraços!

obs, entao tenho que recriar a tabela usando o seguinte script:

CREATE TABLE anotacoes.aluno ( id_aluno int NOT NULL AUTO_INCREMENT, -- Identificador da tabela matricula int, -- Matrícula do aluno nome char(8) , -- Nome do aluno cpf int, -- CPF do aluno PRIMARY KEY (id_aluno) )
:smiley:

Opa…funcionou finalmente…
era esse auto_increment mesmo…
mto obrigado!

=) :lol: :lol: