Problema em Sequence Hibernate e PostgreSQL

Oláo pessoal,

Primeiramente, para que não pareça repetitivo o post porque tem varios aqui no GUJ tratando deste mesmo problema, mas ja tentei todas a dicas citadas neles e não tem jeito de fazer o auto-incremento através da sequence do PostgreSQL funcionar no hibernate.

Já verifiquei as configurações do Bean, inclusive seguindo as dicas mencionadas no forum e também a documentação oficial do Hibernate.
também verifiquei as permissões de acesso da sequence dentro do postgreSQL para garintir que o usuario que a aplicação usa possa fazer
operaçoes de acesso a ela.

Crieu a tabela:

CREATE TABLE "TBSETOR"
(
  "IDSETOR" bigserial NOT NULL,
  "SETOR" character varying(50),
  "DESCRICAO" character varying(100),
  CONSTRAINT "TBSETOR_pkey" PRIMARY KEY ("IDSETOR")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TBSETOR" OWNER TO postgres;

O PostgreSQL criou a sequencia automaticamente:

CREATE SEQUENCE "TBSETOR_IDSETOR_seq"
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE "TBSETOR_IDSETOR_seq" OWNER TO postgres;
GRANT ALL ON TABLE "TBSETOR_IDSETOR_seq" TO postgres;

Quando tento inserir algo no banco o debug acusa este trecho de erro:

... Hibernate: select nextval ('TBSETOR_IDSETOR_seq')
24/03/2011 00:22:08 org.hibernate.util.JDBCExceptionReporter logExceptions
AVISO: SQL Error: 0, SQLState: 42P01
24/03/2011 00:22:08 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: ERRO: relação "tbsetor_idsetor_seq" não existe
  Posição: 17
org.hibernate.exception.SQLGrammarException: could not get next sequence value
...

Meu Bean:

@Entity
@Table(name = "TBSETOR")
@SequenceGenerator(name = "TBSETOR_IDSETOR_seq", sequenceName = "TBSETOR_IDSETOR_seq")
public class Setor implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "IDSETOR")
    @GeneratedValue(generator = "TBSETOR_IDSETOR_seq", strategy = GenerationType.AUTO)
    private long idSetor;
    @Column(name = "SETOR")
    private String setor;
    @Column(name = "DESCRICAO")
    private String descricao;

    /**
     * @return the _idSetor
     */
    public long getIdSetor() {
        return idSetor;
    }

    /**
     * @param idSetor the _idSetor to set
     */
    public void setIdSetor(long idSetor) {
        this.idSetor = idSetor;
    }

    /**
     * @return the _setor
     */
    public String getSetor() {
        return setor;
    }

    /**
     * @param setor the _setor to set
     */
    public void setSetor(String setor) {
        this.setor = setor;
    }

    /**
     * @return the _descricao
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * @param descricao the _descricao to set
     */
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

Alguém sabe o que está errado?

obrigado.

Você pode criar somente seu bean e deixar que o hibernate de encarrega de criar a tabela. Crie somente o banco de dados.

Já trabalhei com o PostgreSQL e faço somente a classe com a base já criada:


@Id @GeneratedValue
@Column(name="id")
private Long id;

Abraço.

Olá Alberthy,

Já usei este processo uma vez mas foi através do wizard do netbeans mas vou tentar gerar a tabela pelo Bean conforme sua orientacão.

Depois posto o resultado.

abraço.

Habilite o show-sql do hibernate para vc visualizar oq está indo pro banco…

Fala aí bele.

Segue 1 exemplo da maneira que utilizo.

Declaração do Bean:

[code]@Entity
@Table(name=“correntista”)
public class CorrentistaBean implements Serializable {

@Id  
@GeneratedValue(strategy=GenerationType.IDENTITY)  
@Column(name="id_correntista")  
    private Long id;

[/code]

Criação da tabela:

CREATE TABLE correntista ( id_correntista serial NOT NULL, nome character(50) NOT NULL ) WITH ( OIDS=FALSE ); ALTER TABLE correntista OWNER TO postgres;

Criação da sequence:

CREATE SEQUENCE correntista_id_correntista_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 3 CACHE 1; ALTER TABLE correntista_id_correntista_seq OWNER TO postgres;

Associação campo com sequence:

obrigado pessoal pelas dicas,

Mas conforme orientação do colega acima só consegui utilizar a sequence do PostgreSQL fazendo com que ela fosse gerada através do hibernate, funcionou perfeitamente.
Só não entendo qual foi a diferença já que as criadas pela hibernate são exatamente iguais inclusive configuração as que eu tinha criado manualmente no banco.
De qualquer forma deixo meu arquivo SessionFsctory aqui para auxiliar outros colegas que passarem por esta dificuldade.

Obrigado a todos.

package data.dao;

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

import entities.*;

/**
 *
 * @author Robson
 */
public class HibernateSessionFactory {

    private static SessionFactory sessionFactory;
    private static AnnotationConfiguration config;

    /**
     * Configura Propriedades
     */
    private static void Configure() {
        config = new AnnotationConfiguration();

        config.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
        config.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/DB");
        config.setProperty("hibernate.connection.username", "postgres");
        config.setProperty("hibernate.connection.password", "postgres");
        config.setProperty("hibernate.connection.pool_size", "1");
        config.setProperty("hibernate.show_sql", "true");
        config.setProperty("hibernate.hbm2ddl.auto", "update");

        config.addAnnotatedClass(Setor.class);

        sessionFactory = config.buildSessionFactory();
    }
    
    /**
     * obtém sessão
     * @return session
     */
    public static Session getSession() {
        if (sessionFactory == null) {
            Configure();
        }
        return sessionFactory.openSession();
    }
}