Erro com Hibernate + PostGre + auto incremento [RESOLVIDO]

Olá Pessoal.
Já li e reli um monte de tutorias e artigos aqui do fórum mas ainda não encontrei o meu erro.
Bem, é o seguinte, sou novato com o hibernate e estou precisando de ajuda com o autoincremento!

meu BD:

[code]-- Table: clientes

– DROP TABLE clientes;

CREATE TABLE clientes
(
nome character varying,
cpf character varying,
id bigserial NOT NULL,
CONSTRAINT clientes_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE clientes OWNER TO postgres;[/code]

Minha SEQUENCE:

[code]-- Sequence: clientes_id_seq

– DROP SEQUENCE clientes_id_seq;

CREATE SEQUENCE clientes_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
ALTER TABLE clientes_id_seq OWNER TO postgres;
[/code]

E na minha classe estou fazendo annotations:


import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.Entity;

@Entity
@Table(name="clientes")
@SequenceGenerator(name = "clientes_id_seq", sequenceName = "clientes_id_seq")


/**
 * Clientes generated by hbm2java
 */
public class Clientes  implements java.io.Serializable {
    
    private static final long serialVersionUID = 1L;

    @Id
    @Column (name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "clientes_id_seq")
     private long id;

     private String nome;
     private String cpf;
...

Só que não está funcionando…Eu cadastro o primeiro e ele já começa do 0 quando vou cadastrar novamente ele não gera uma nova chave primária e gera o erro de Violação de Primary Key e acusa Could not execut JDBC bath update!
Por favor, me ajudem… já tentei de tudo e não consigo…
Abraço a todos!

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “clientes_id_seq”)

no generatioType, ao invés de SEQUENCE, coloque AUTO.

Olá Amigo…
Obirgado pela força…
Ele continua gerando o mesmo erro…
Ae vai o erro completo:

[code]AVISO: SQL Error: 0, SQLState: 23505
18/10/2011 15:02:38 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: ERRO: duplicar valor da chave viola a restrição de unicidade “clientes_pkey”
18/10/2011 15:02:38 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
GRAVE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at DAO.DAOCliente.inserir(DAOCliente.java:48)
at testehibernate.Main.main(Main.java:30)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into public.clientes (nome, cpf, id) values (Anderson, 124835, 0) foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
at org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:403)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
… 9 more

[/code]

Aqui como eu faço.

    @Id    
    @SequenceGenerator(name = "SEQ_CLIENTE",sequenceName = " cliente_seq")
    @GeneratedValue( strategy = GenerationType.AUTO,generator = "SEQ_CLIENTE")
    @Column(name = "id_cliente", unique=true)
	private Integer idCliente;

No seu banco coloquei o id como integer e não serial, assim fica genérico para todos os bancos.

Olá amigo.
Fiz como vc falou veja:


private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name = "clientes_id_seq",sequenceName = "clientes_id_seq")
    @GeneratedValue( strategy = GenerationType.AUTO,generator = "clientes_id_seq")
    @Column(name = "id", unique=true)
     private long id;

Onde era o seu SEQ_CLIENTE substituí pelo meu clientes_id_seq… correto?
Mas continua gerando o mesmo erro… troquei minha tabela para bigint no banco e também fiz uma nova sequência para ela que ficou idêntica a outra, mas nada… até agora o mesmo erro…
Valeu pela força!!!

Amigos…
Eu reparei uma coisa no corpo do erro:

GRAVE: Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Será que é ajuda?

Essa era o seu antigo código

@Entity  
@Table(name="clientes")  
@SequenceGenerator(name = "clientes_id_seq", sequenceName = "clientes_id_seq")  
  
  
/** 
* Clientes generated by hbm2java 
*/  
public class Clientes  implements java.io.Serializable {  
      
    private static final long serialVersionUID = 1L;  
  
    @Id  
    @Column (name = "id")  
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "clientes_id_seq")  
     private long id;  
  
     private String nome;  
     private String cpf;  
...  

Retira o annotation acima do nome da classe

@SequenceGenerator(name = "clientes_id_seq", sequenceName = "clientes_id_seq")  

Depois deixe o seu último código postado

no banco deixe assim:

CREATE TABLE clientes  
(  
  nome character varying,  
  cpf character varying,  
  id integer NOT NULL,  
  CONSTRAINT clientes_pkey PRIMARY KEY (id)  
)  
WITH (  
  OIDS=FALSE  
);  
ALTER TABLE clientes OWNER TO postgres;  

dê preferência em gerar as tebelas pelo hibernate.

Cara, ainda não deu certo…
Como eu faria para criar as tabelas a partir do hibernate?
Me dá esse help que talvez o erro suma…
Brigadão!

Cara te passo sim, só não tenho ele aqui agora mais assim que eu chegar em ksa te passo, não lembro de cabeça agora.

Beleza cara, eu estou tentando aqui seguir alguns tutos na net mas tá dose…
O erro continua ainda… talvez com ele gerando as tabelas evite esse tipo de erro.
Obrigado pela força, caso descubra no meu código ae alguma coisa que possa estar gerando o erro me fala ae pessoal!

Amigos…
Continuei tentando aqui mas sem sucesso…
Não consigo corrigir o erro, não sei o que pode estar havendo…
O lance é que parece que minha classe java não se comunica com a sequence criada no postgre, pois tem um campo no post dizendo : Já foi acessada? E lá está marcado como não!
Se precisarem de mais alguma parte do código por favor me falem…
Abraçoss e obrigado pela ajuda!

Ta na mão como prometido como gerar tabelas no banco


public static void main(String[] args){
	AnnotationConfiguration cfg = new AnnotationConfiguration();
				
	try{	

            create(cfg.addAnnotatedClass(NomeBean.class));
		         
       }catch(Exception e){
          e.getMessage();
      }
}

	private static void create(AnnotationConfiguration cfg) throws Exception{
		new SchemaExport(cfg).create(true, true);		
	}	

Amigo, vc setando o codigo a mão grava no banco? pois se não gravar o problema é que vc esta declarando algo errado no java…

Seguinte:
a minha anotação na classe é (em uma classe Marca):

@Entity
@SequenceGenerator(name = "seq_marca", sequenceName = "seq_marca", allocationSize = 1)
public class Marca {
...

A minha anotação no atributo é:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "seq_marca")
private int codigo;
...

e no BD, a seq é :

CREATE SEQUENCE seq_marca
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE seq_per OWNER TO postgres;

lendo seu codigo… uma das poucas diferenças que vejo é o tipo de dado da minha chave primaria…

outra coisa que sofri para descobrir foi que estava setando o codigo e implementando o auto incremento…

da erro, óbvio…

posta o codigo da DAO, e o codigo do ação do botão em questão!!!

Olá amigo!
Obrigado pela ajuda!
Cara, se eu seto manualmente o BD funfa legal…
Tipo, eu fui e fui setando manualmente o id… colocando mais um pra não dar pau e ele funciona legal… faz pesquisas e tudo mais…
É só esse lance mesmo…
E tipo, quando eu coloco minha varíavel de banco como int ele não gera a sequence automaticamente… ae eu gerei manual mas foi exatamente a mesma coisa que o outro…
Estive olhando seu exemplo cara, esse seq_marca é o nome da sua sequence no postgre… correto?
Segue o código DAO:

public class DAOCliente {

   private static SessionFactory factory;
     static{
       try{
        factory = new Configuration().configure().buildSessionFactory();
       }
       catch (Exception e ){
        JOptionPane.showMessageDialog(null,"ERRO AO CONECTAR:"+e);
       }

    }

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


    public void inserir (testehibernate.Clientes c) {
        Session session = getSession();
        Transaction t = session.beginTransaction();
        session.save(c);
        t.commit();
        session.close();
    }[/code]

E segue o código de ação, não é um botão, executa direto no main pois é só um teste:
[code] public static void main(String[] args) {
         Clientes c = new Clientes();
      
        try{
        
        c.setNome("Anderson");
        c.setCpf("124835");
        DAOCliente daoCliente = new DAOCliente();
        daoCliente.inserir(c);

Qualquer coisa é só falar pessoal!
Obrigado a todos!

amigo, acho que descobri o que pode ser:

CREATE SEQUENCE seq_marca
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE seq_per OWNER TO postgres;

vc tem esse codigo na seq do seu bd… tenta colocar o START EM 10, ou colocar para o proximo valor do id do seu banco…
pelo erro, vc esta tentando duplicar uma chave… e esta iniciando em 1, e pelo que relatou ja tem mais de um registro…
testa ai!!!

Olá amigo!
Cara, diz isso que vc falou mas ainda assim não funcionou…
Mas agora ele chamou a sequence…porque no campo foi chamada? do postgre ele agora mudou para sim…
Mas coloquei o start em 10 e nada…
Tentei também zerar a tabela pra ver se ia mas não deu nada também… mesmo colocando o start em 10 quando executei ele parece que chamou a sequence mas começou a chave com 0…
Heeeeelp!!!
O que vc acha cara?

posta ai como esta o seu codigo agora… classe, dao, tabela do bd, sequence…

to com tempo agr!!!

Vamo lá:
Classe:


import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Entity;


@Entity
@SequenceGenerator(name = "clientes_id_seq", sequenceName = "clientes_id_seq", allocationSize = 1)

/**
 * Clientes generated by hbm2java
 */
public class Clientes  implements java.io.Serializable {
    
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "clientes_id_seq")
    private long id;

     private String nome;
     private String cpf;

    public Clientes() {
    }

	
    public Clientes(long id) {
        this.id = id;
    }
    public Clientes(long id, String nome, String cpf) {
       this.id = id;
       this.nome = nome;
       this.cpf = cpf;
    }
   
    public long getId() {
        return this.id;
    }
    
    public void setId(long id) {
        this.id = id;
    }
    public String getNome() {
        return this.nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getCpf() {
        return this.cpf;
    }
    
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }




}

DAO:

[code]
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.Criteria;
import org.hibernate.Query;

import testehibernate.Clientes;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

/**
*

  • @author Andre
    */
    public class DAOCliente {

    private static SessionFactory factory;
    static{
    try{
    factory = new Configuration().configure().buildSessionFactory();
    }
    catch (Exception e ){
    JOptionPane.showMessageDialog(null,“ERRO AO CONECTAR:”+e);
    }

    }

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

    public void inserir (testehibernate.Clientes c) {
    Session session = getSession();
    Transaction t = session.beginTransaction();
    session.save©;
    t.commit();
    session.close();
    }

    public void delete (Clientes c){
    Session session = factory.openSession();
    session.delete©;
    session.flush();
    session.close();
    }

    public Clientes getOne(String pk) throws Exception{
    Session session = getSession();
    Clientes c = new Clientes();
    JOptionPane.showMessageDialog(null,pk);
    Transaction t = session.beginTransaction();
    Criteria select = session.createCriteria(Clientes.class);
    select.add(
    Restrictions.like(“id”,pk)

             );
    List<Clientes> l = select.list();
    c.setNome(l.get(0).getNome());
    c.setCpf(l.get(0).getCpf());
    c.setId(l.get(0).getId());
    
    
    
     return c;
    

    }[/code]

Tabela BD:

-- Table: clientes

-- DROP TABLE clientes;

CREATE TABLE clientes
(
  nome character varying,
  cpf character varying,
  id bigserial NOT NULL,
  CONSTRAINT clientes_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE clientes OWNER TO postgres;

Sequence:

[code]
– Sequence: clientes_id_seq

– DROP SEQUENCE clientes_id_seq;

CREATE SEQUENCE clientes_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
ALTER TABLE clientes_id_seq OWNER TO postgres;[/code]

Amigo, na tua classe, tenta fazer o seguinte:


@Entity
@SequenceGenerator(name = "clientes_id_seq", sequenceName = "clientes_id_seq", allocationSize = 1)

public class Clientes {
    

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "clientes_id_seq")
    private long id;
    private String nome;
    private String cpf;


}

gera os acessadores e tenta executar,

testa ai!