Hibernate: Generator X BD:Auto-Incremento

Galera estou querendo usar o auto incremento do banco.
Deu uma olhada na documentação e cheguei no seguinte mapeamento da id:

        <id name="codigo" type="int" unsaved-value="null">
            <column name="cod_est" sql-type="int" not-null="true" />
        </id>

unsaved-value=“null” --> para atribuir null quando o objeto é transiente e gravar no banco.

Tentei colocar a id do VO como Integer e dá esses paus:

Usando o sessio.saveOrUpdate(objeto);
-Ele só executa update.
-Não insere o objeto de forma alguma.
Erro:

HibernateException: net.sf.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()

Usando o sessio.save(objeto);

HibernateException: net.sf.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()

Usando o sessio.update(objeto) ele funciona legal;


Tentei usar a minha id do VO como int, só que quando tento salvar ela não considera o id como null e sim como o valor default do int (0);

Usando o sessio.save(objeto);

HibernateException: net.sf.hibernate.JDBCException: Could not synchronize database state with session: Entrada em lote 0 insert into estado (descricao, sigla, cod_est) values ( foi abortada. Chame getNextException() para ver a causa.

Ele tenta inserir um novo registro passando a id, dai o banco berra, pois além de estar com auto-incremento ele já tem um registro com id = 0.

Usando o sessio.saveOrUpdate(objeto) ao invés de incluir ele detecta um registro com a mesma id e faz update.

Usando o sessio.update(objeto) ele funciona legal;

Obs.: Estou testando a aplicação com Postgresql mas ela rodará também com Oracle.

Olá, fabriciogiordani!
Também utilizo PostreSql, com Hibenate e Spring.
Aqui, usamos o mapeamento conforme abaixo:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“sequence”>
<param name=“sequence”> pessoa_id_seq</param>
</generator>
</id>
Se fosse HSQLDB seria:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“identity”>
<param name=“identity”> pessoa_id_seq</param>
</generator>
</id>
Cada um utiliza formas diferentes dee sequenciar. No seu caso, PostgreSQL usa gerador com sequence.
Té mais!

Olá, fabriciogiordani!
Também utilizo PostreSql, com Hibenate e Spring.
Aqui, usamos o mapeamento conforme abaixo:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“sequence”>
<param name=“sequence”> pessoa_id_seq</param>
</generator>
</id>
Se fosse HSQLDB seria:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“identity”>
<param name=“identity”> pessoa_id_seq</param>
</generator>
</id>
Cada um utiliza formas diferentes dee sequenciar. No seu caso, PostgreSQL usa gerador com sequence.
Té mais!

Olá, fabriciogiordani!
Também utilizo PostreSql, com Hibenate e Spring.
Aqui, usamos o mapeamento conforme abaixo:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“sequence”>
<param name=“sequence”> pessoa_id_seq</param>
</generator>
</id>
Se fosse HSQLDB seria:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“identity”>
<param name=“identity”> pessoa_id_seq</param>
</generator>
</id>
Cada um utiliza formas diferentes dee sequenciar. No seu caso, PostgreSQL usa gerador com sequence.
Té mais!

[quote=“cleidimar”]Olá, fabriciogiordani!
Também utilizo PostreSql, com Hibenate e Spring.
Aqui, usamos o mapeamento conforme abaixo:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“sequence”>
<param name=“sequence”> pessoa_id_seq</param>
</generator>
</id>
Se fosse HSQLDB seria:
<id name=“id” column=“id” type=“int” unsaved-value="-1">
<generator class=“identity”>
<param name=“identity”> pessoa_id_seq</param>
</generator>
</id>
Cada um utiliza formas diferentes dee sequenciar. No seu caso, PostgreSQL usa gerador com sequence.
Té mais![/quote]

Aproveitando a resposta dada para o Fabrício vc poderia me responder a uma pergunta. Estou tendo alguns problemas com utilização de gerador de seqüencia com PostgreSQL. Na tag generator class estou utilizando sequence que é o nome do gerador de seguencias do banco. A dúvida que eu tenho é que na tag id propriedade unsalved value estou utilizando null. O campo de chave prirmária, estou uzando long. Existem algumas classes em que o Banco acusa o mesmo problema que o Fabrício está enfrentando. Qual seria a melhor implemantação, utilizar unsalved value como null ou com o Long = -1, e por que você utiliza este valor?

Olá, RobsonSSantos!
Na tag id, a propriedade type é o tipo que o Hibernate usará de acordo com o banco de dados que você criou. No meu caso é int, porque no banco é int. No seu caso, só use long se no banco for long ou se o Hibernate conseguir transformar o tipo numérico que vc está usando em um long.
Já a propriedade unsavedValue, que é responsável por “marcar” os objetos transientes, ou seja que ainda não foram persistidos no banco, eu uso -1 porque aqui na empresa padronizamos isso. Na verdade, todo objeto persistido terá um valor positivo. Então nessa propriedade só poderemos utilizar valores não positivos, como null ou negativos.
Bom, nós utilizamos sempre desse modo e, para nós, tá funcionando muito bem. Experimente dessa forma.
Value?

Obrigado por sua resposta Cleidmar. Você me ajudou bastante, realmente exclareceu minha dúvida. Na tag id propriedade type estamos realmente utilizando long. E a minha maior dúvida era sobre unsalved value. Estava com dúvida se este valor que vc utiliza tinha haver com o banco ou era por convensão. Aqui estamos utizilando valor “null”. Estava tendo problemas em me acustumar com os logs de erro do drive JDBC do PostgreSQl, mas acho que agora está sem problemas. Qualquer dúvida sobre hibernate posso me reportar a vc? Se precisar de alguma coisa em que puder ajudar estou as ordens.

Robson Silvério dos Santos

O PJ tem esse intuito: troca de informações. E é isso que faz dele o melhor em Java do Brasil.
Se quizer mais material pra leitura pode se cadastrar também no APIJava.
Obrigada e até mais.