Persistencia - Hibernate PostgreSQL

Boa noite
Estou começando a utilizar o Hibernate e tenho uma dificuldade na persistencia com o BD PostgrSQL.
Fiz as configuracoes e mapemantos todos certos e na hora de gravar me aparece um erro.

codigo de persistencia:

No HibernateDao

[code]@Override
public void salvar(T bean) {
Session session = HibernateUtil.getSessionfactory().getCurrentSession();
session.beginTransaction();
session.save(bean);
session.getTransaction().commit();
session.close();

}[/code]

No HibernateTest

public HibernateTest() { super(); HibernateDao<Cliente> clienteDao = new HibernateDao<Cliente>(Cliente.class); Cliente cliente = new Cliente(); cliente.setNome_cli("Rafael"); cliente.setSexo_cli("M"); cliente.setDt_cad_cli("08-06-2011"); cliente.setLogin_cad_atualiz_cli("Biel"); cliente.setCtrl_atualizacao_cli(1); clienteDao.salvar(cliente); }

1- Minha primeira duvida é como gravar campos tipo Date no postgre pelo Hibernate?
obs: Como podem ver o campo dt_cad_cli é do tipo date mas eu nao consigo gravar como tal, tentei mapear ele como String para tentar gravar.

2- Quando execulto o servlet HibernateTest.java me aparece o seguinte erro: [color=red]org.postgresql.util.PSQLException: ERRO: relação “hibernate_sequence” não existe[/color]

A tabela(Resumida) na qual estou tentando gravar os dados foi criada dessa forma:

create table CLIENTE ( ID_CLIENTE SERIAL not null, NOME_CLI VARCHAR(55) unique not null, SEXO_CLI CHAR(1) not null, DT_CAD_CLI DATE not null, LOGIN_CAD_ATUALIZ_CLI VARCHAR(12) not null, CTRL_ATUALIZACAO_CLI INT2 not null, constraint PK_CLIENTE primary key (ID_CLIENTE) );

OBS: O campo com a palavra reservada SERIAL no Postgre representa um campo inteiro unico e auto-increment.

Se alguém puder me ajudar fico agradecido.

Você precisa criar a seqüência no banco de dados: CREATE SEQUENCE SEQ_NAME START 1
Posta seu mapeamento.

Meu mapeamento é

Cliente.hbm.xml

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

[/code]
por
[code]&lt;generator class="increment"&gt;&lt;/generator&gt; [/code]

por

Altera para:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;

&lt;hibernate-mapping&gt;
  &lt;class name="br.com.cc.model.bean.Cliente" table="cliente"&gt;
	&lt;id name="id" column="id_cliente"&gt;
            &lt;generator class="sequence"&gt;
                &lt;param name="sequence"&gt;SEQ_CLIENTE&lt;/param&gt;
            &lt;/generator&gt;
        &lt;/id&gt;

      &lt;property name="nome_cli"&gt;&lt;/property&gt;
      &lt;property name="sexo_cli"&gt;&lt;/property&gt;
      &lt;property name="dt_cad_cli"&gt;&lt;/property&gt;
      &lt;property name="login_cad_atualiz_cli"&gt;&lt;/property&gt;
      &lt;property name="ctrl_atualizacao_cli"&gt;&lt;/property&gt;

  &lt;/class&gt;
&lt;/hibernate-mapping&gt;

Depois no banco de dados cria a sequencia: CREATE SEQUENCE SEQ_CLIENTE START 1

OK fiz como dito acima mapiei a sequencia (com nomde de “serial”):

e criei a sequencia no BD com o mesmo nome executei servlet novamente e :

[color=red] 08/06/2011 22:56:54 org.apache.catalina.core.AprLifecycleListener init INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\CollabNet\Subversion Client;C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin;C:\Users\Public\Documents\RAD Studio\8.0\Bpl;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Java\jdk1.6.0_24\bin;C:\Program Files (x86)\Delphi7SE\bin;C:\Program Files (x86)\Delphi7SE\Projects\BPL;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Program Files\TortoiseSVN\bin 08/06/2011 22:56:54 org.apache.tomcat.util.digester.SetPropertiesRule begin AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Casa_Conforto' did not find a matching property. 08/06/2011 22:56:54 org.apache.coyote.http11.Http11Protocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 08/06/2011 22:56:54 org.apache.catalina.startup.Catalina load INFO: Initialization processed in 658 ms 08/06/2011 22:56:54 org.apache.catalina.core.StandardService start INFO: Starting service Catalina 08/06/2011 22:56:54 org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.32 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select nextval ('serial') 08/06/2011 22:56:56 org.apache.catalina.core.ApplicationContext log INFO: Marking servlet HibernateTest as unavailable 08/06/2011 22:56:56 org.apache.catalina.core.StandardContext loadOnStartup GRAVE: Servlet /Casa_Conforto threw load() exception org.postgresql.util.PSQLException: ERRO: permissão negada para sequência serial
[/color]

como acerto isso ?

Puxa, agora não sei o que pode ser.
É alguma coisa relativa a permissão no PostgrSQL, eu acho.

Só um dica sobre quando se cria sequencia.
Por padrão se usa o nome da sequencia o mesmo nome da tabela, precedido ou sucedido da palavra seq e separados por underline: seq_clienete ou cliente_seq.
Se faz isso pq você terá N tabelas em um banco de dados e todas deverão ter sua própria sequencia, e também torna mais fácil saber qual sequencia se refere a tal tabela.

Eu achava que o postgre criasse uma sequencia automaticamente quando eu criasse uma coluna com o tipo serial.
nao sabia que tinha que criar manualmente uma sequence depois, até porque quando eu faco um INSERT no pgAdmin e nao coloco o id_cliente ele incrementa automaticamente e nao decha eu cadastrar 2 id_clientes com o mesmo valor.

insert into cliente (nome_cli, sexo_cli, dt_cad_cli, login_cad_atualiz_cli, ctrl_atualizacao_cli) values ('Bruno', 'M', '08-06-2011', 'Biel', 1 );

No exemplo acima o id_cliente nao foi inserido manualmente(mesmo sendo um campo obrigatório e chave primária) porém o postgre cadastra incrementando automaticamente a coluna id_cliente. Será que nao existe um sequence já criado por debaixo dos panos para essa coluna ? tem como eu dar um SELECT e ver todos os sequences do meu banco ?


Sequence e Id_autoincremento são coisas diferentes.

Na sua tabela você vai ter um Id, mas não significa que seja o mesmo valor da sequencia.

A sequencia serve para relacionar o ID da tabela com o hibernate.
É como se você tivesse uma tabela dizendo:

id tabela | sequence
0000001 | 00000001
0000002 | 00000010
0000003 | 00000015

Não é necessário serem o mesmo valor, o hibernate sempre vai procurar na sequencia o id e então por esse id a pesquisa vai ser feita na tabela.
Quando criar um novo ID na tabela, já terá uma nova sequencia criada também.

Muitas vezes quando acontece um rollback em um insert o id da tabela não é criado, mas a sequencia já foi criado, então por esse motivo acontece essa diferença de valor entre sequencia e id da tabela.

Da uma olhada aqui:
http://pgdocptbr.sourceforge.net/pg82/sql-createsequence.html

Sequence e Id_autoincremento são coisas diferentes.

Na sua tabela você vai ter um Id, mas não significa que seja o mesmo valor da sequencia.

A sequencia serve para relacionar o ID da tabela com o hibernate.
É como se você tivesse uma tabela dizendo:

id tabela | sequence
0000001 | 00000001
0000002 | 00000010
0000003 | 00000015

Não é necessário serem o mesmo valor, o hibernate sempre vai procurar na sequencia o id e então por esse id a pesquisa vai ser feita na tabela.
Quando criar um novo ID na tabela, já terá uma nova sequencia criada também.

Muitas vezes quando acontece um rollback em um insert o id da tabela não é criado, mas a sequencia já foi criado, então por esse motivo acontece essa diferença de valor entre sequencia e id da tabela.

Da uma olhada aqui:
http://pgdocptbr.sourceforge.net/pg82/sql-createsequence.html

Revirando a internet pra tentar resolver esse problema eu encontrei esse link:
http://www.bau-de-dev.com/banco-de-dados/postgresql/como-criar-um-campo-auto-increment-no-postgresql

Quando voce falou que id da tabela é diference do sequence eu intendi mas eu quiz dizer que quando vc coloca uma coluna como serial o postgreSQL por baixo dos panos cria uma sequence como mostrado nesse matéria(isso eu suponho confiando noque a matéria me diz). Essa matéria diz que o nome da “sequence” é criado seguindo a seguinte sintaxe: NOME_TABELA_NOME_CAMPO _SEQ
ex: cliente_id_cliente_seq

Eu resolvei o erro de permissao que estava dando e configurei o hibernate para acessar essa sequencia (cliente_id_cliente_seq):
Cliente.hbm.xml

<hibernate-mapping> <class name="br.com.cc.model.bean.Cliente" table="cliente"> <id name="id_cliente" column="id_cliente" type="integer"> <generator class="sequence"> <param name="sequence">cliente_id_cliente_seq</param> </generator> </id> <property ...

Quando eu execulto me aparece o seguinte:

09/06/2011 14:58:18 org.apache.catalina.core.AprLifecycleListener init INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\CollabNet\Subversion Client;C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin;C:\Users\Public\Documents\RAD Studio\8.0\Bpl;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Java\jdk1.6.0_24\bin;C:\Program Files (x86)\Delphi7SE\bin;C:\Program Files (x86)\Delphi7SE\Projects\BPL;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Program Files\TortoiseSVN\bin 09/06/2011 14:58:18 org.apache.tomcat.util.digester.SetPropertiesRule begin AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Casa_Conforto' did not find a matching property. 09/06/2011 14:58:18 org.apache.coyote.http11.Http11Protocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 09/06/2011 14:58:18 org.apache.catalina.startup.Catalina load INFO: Initialization processed in 643 ms 09/06/2011 14:58:18 org.apache.catalina.core.StandardService start INFO: Starting service Catalina 09/06/2011 14:58:18 org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.32 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select nextval ('cliente_id_cliente_seq') Hibernate: insert into cliente (fk_prim_contato, nome_cli, email_cli, dt_nascimento_cli, sexo_cli, cpf_cli, rg_cli, cnpj_cli, est_civil_cli, tel_cli, cel1_cli, cel2_cli, dt_cad_cli, login_cad_atualiz_cli, dt_atualizacao_cli, dt_exclusao_cli, ctrl_atualizacao_cli, id_cliente) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) 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:266) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 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 br.com.cc.model.dao.HibernateDao.salvar(HibernateDao.java:22) at br.com.cc.controller.HibernateTest.<init>(HibernateTest.java:26) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1116) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4733) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) at org.apache.catalina.core.StandardService.start(StandardService.java:525) at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into cliente (fk_prim_contato, nome_cli, email_cli, dt_nascimento_cli, sexo_cli, cpf_cli, rg_cli, cnpj_cli, est_civil_cli, tel_cli, cel1_cli, cel2_cli, dt_cad_cli, login_cad_atualiz_cli, dt_atualizacao_cli, dt_exclusao_cli, ctrl_atualizacao_cli, id_cliente) values (NULL, 'Rafael', NULL, NULL, 'M', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '08-06-2011', 'Biel', NULL, NULL, '1', '8') foi abortada. Chame getNextException para ver a causa. at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2598) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2737) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 32 more 09/06/2011 14:58:20 org.apache.coyote.http11.Http11Protocol start INFO: Starting Coyote HTTP/1.1 on http-8080 09/06/2011 14:58:20 org.apache.jk.common.ChannelSocket init INFO: JK: ajp13 listening on /0.0.0.0:8009 09/06/2011 14:58:20 org.apache.jk.server.JkMain start INFO: Jk running ID=0 time=0/33 config=null 09/06/2011 14:58:20 org.apache.catalina.startup.Catalina start INFO: Server startup in 2024 ms

Oque eu fiz errado e como acerto ? foi mal pelo excesso de perguntas mas eu to igual sego em tiroteio, já consegui fazer o CRUD com Hibernate + mySql e nao consegui fazer nenhum insert no postgreSQL com o Hibernate. Gostaria muito de usar o PostgreSQL pois na minha concepcao é o melhor Banco gratuito que existe atualmente contando com rapidez, seguranca, estabilidade , etc … porém tá sendo um parto pra usa-lo com o Hibernate.

Se alguma alma caridosa(rs) que já desenvolveu ou sabe desenvolver com hibernate + postgreSQL puder me ajudar ficaria muito grato. Obrigado pela atencao

Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into cliente (fk_prim_contato, nome_cli, email_cli, dt_nascimento_cli, sexo_cli, cpf_cli, rg_cli, cnpj_cli, est_civil_cli, tel_cli, cel1_cli, cel2_cli, dt_cad_cli, login_cad_atualiz_cli, dt_atualizacao_cli, dt_exclusao_cli, ctrl_atualizacao_cli, id_cliente) values (NULL, 'Rafael', NULL, NULL, 'M', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '08-06-2011', 'Biel', NULL, NULL, '1', '8')

v0olverine este campo fk_prim_contato é uma chave estrangeira certo ?
Esse erro e devido ela estar nulla values (NULL verifica isso ai no seu código o que ta acontecendo
pra ela estar nula.
E quanto ao <generator class=“sequence”> usa increment.

Eu realmente nao estou cadastrando o campo fk_prim_contato e ele realmente é uma chave estrangeira para tabela prim_contato, mas eu criei a tabela “cliente” com o o campo fk_prim_contato como null e nao como not null ou seja eu deveria poder fazer um cadastro de cliente sem esse campo preenchido ou com ele nulo(acho eu) pelo menos no PgAdmin do postgre(direto com comandos SQL) eu consigo.

Agora eu cadastrei o esse campo e deu exatamente o mesmo erro. Será que esse erro nao é devido eu estar tentando cadastrar o campo “dt_cad_cli” como tipo String já que o mesmo no BD está como tipo date ? se for possivel que seja por isso, como eu cadastro data no Postgre com o Hibernate ? Direto no PgAdmin eu coloco entre aspas simples e separado por “-” e cadastra na boa, e no Hibernate como faco ? Se o erro nao for esse qual pode ser ? Obrigado pela atencao de todos.