Hibernate - "Assigned" e "identity" generators - Gerar ID automaticamente ou setar manualmente

Pessoal,

necessito, hora sim, hora não, associar um ID manualmente antes de persistir os dados em meu banco de dados. Para isso, estou utilizando a opção “assigned” no mapeamento da chave primária no HBM.

<id name="fnjv" type="long">
      <column name="fnjv"/>
      <generator class="assigned"/>
</id>

Ótimo, isso funciona. Quando preciso associar um ID, seto ele antes de salvar o objeto. Quando eu não preciso setar o ID manualmente, simplesmente salvo o objeto e o Hibernate cria o ID no meu banco de dados.

Meu problema é: Preciso saber qual o ID criado automaticamente pelo hibernate. Se eu verificar no banco de dados, ele cria um ID sequencialmente de forma correta. No entanto, se eu consultar o retorno do método save do hibernate, ele me retorna 0.

session.save(obj); //este método não está retornando o ID corretamente, retorna sempre 0

Alguém tem idéia do que ocorre?

parece que ele seta a propriedade no proprio objeto persistido depois de salvar

da um obj.getCodigo() sei la e ve como fica depois de persistir

Já verifiquei. E o valor também é 0! =(

Here is the example of generator element from our first application:

In this case element do not generate the primary key and it is required to set the primary key value before calling save() method.

Ou seja ele fica zero, pq não joga nada.

usa o “identity” e o auto increment no banco, mesmo sendo auto-increment vc pode setar o seu valor

Obrigado pela ajuda heroijapa. Mas infelizmente não funcionou ainda.
A chave primária já estava como auto-incremento no banco de dados.

Quando eu uso o gerador “identity”, mesmo que eu sete o ID manualmente, o hibernate gera um ID sequencial no banco, e ignora o ID que eu setei.

Po… Ta dificil, alguem mais pode tentar, eu esgotei minhas possibilidades hehehe

Bom, em resumo, minha dúvida é:

“Existe alguma forma de configurar o hibernate de forma a permitir que, dado um atributo que é chave primária, eu possa tanto setar um valor para ele, quanto o hibernate gerar um valor automaticamente caso eu não insira nenhum”?

nobody else?

Cara… tem um esquema feio…

Mapeia 2x a mesma tabela com objetos diferentes, e num vc poe assigned e no outro identity, ai quando vc for salvar usa o tipo q vc precisa, manual ou auto.

Assim quando for salvar id manual usa o model assigned

e quando for auto usa o identity e pega a chave

é Feio mas ngm deu resposta melhor até agora

Tipo tem como vc contar o que vc quer com isso, quem sabe tem outra resposta, acho dificil uma situação assim.

Parece ser uma solução interessante! Embora seja um workaround, é funcional, e parece que resolve o meu problema. =)

Meu cenário é o seguinte:
Estou gerando um sistema para cadastro de itens de um museu. Casa item existente no museu possui um ID gerado manualmente pelos funcionários do museu (Pois eles ainda armazenam cada item no excel, e por isso geraram manualmente cada ID).
No entanto, depois que o sistema que estou gerando estiver pronto, eles vão poder cadastrar os itens já existentes (digitando o ID de cada um), e poderão também inserir itens novos, (com o sistema gerando os IDs automaticamente).

Obrigado pela ajuda heroijapa!

o osso é que pode dar duplicidade, tipo um cara gera o 10 no excel mas não digita no sistema

ai outro cara gera um pelo sistema que vira o 10.

Depois o primeiro vai passar do excel e não vai pq já tem o 10…

Fuuuuuu!

hehehehehe

Vc pode pensar em usar só o auto increment, e ter uma segunda chave, única, mas nullable chamada código excel.

Ai o cara pode buscar pelos 2 campos, codigo sistema, ou codigo excel, sei lá

Pois é, esses problemas podem ocorrer! Suas dicas me foram muito úteis!

Valew heroijapa!!