HIBERNATE Forçar usar o ID que quero

8 respostas
jingle

Olá utilizo hibernate para gerenciar meu banco postgres.

Monto meu objeto contendo todos dados inclusive o ID e chamo o .save(Objeto) mas ele ignora meu ID e utiliza o da sequence que esta no postgres, tem alguma forma de eu forçar ele usar meu ID?

pois tenho alguns registros “do sistema” que sempre ao subir servidor deve verificar se eles existem caso não existe devo inseri-los como eles podem ser modificados, não posso fazer verificação pela descrição, dai faço pelo id, mas se o hibernate fica utilizando a sequence eu não tenho como garantir que ele fique com ID que eu quero.

8 Respostas

leoramos

Tira o Sequence do banco… simples.
Oooou então, cria um outro identificador no teu objeto; o que eu fortemente aconselho, já que tu queres usar constantes.
Abraço!

jingle

Tirar a sequencê vai ser um tanto quanto ruim, pois quando os usuários forem incluir um novo registro nessa tabela eu vou ter que gerenciar o ID (esta é uma tabela que tanto tem registro do sistema “constantes” como tem registro adicionado pelo usuários).

Quanto a criar um outro ID, não fica estranho uma tabela com dois identificadores? um só pra ser utilizado como constante do sistema. (mas acho que vou acabar fazendo assim mesmo.)

leoramos

Então… é que não dá pra ter o melhor dos dois mundos (o banco gerenciar, e tu gerenciar só quando quiser). Quer dizer, talvez dê, mas eu não sei.
Pensa numa tabela de Pessoas Físicas, em que há um ID, mas há também um CPF, que não deixa de ser um identificador.
Não pensei em nenhuma solução melhor, digo, não parei nem pra pesquisar algo. Mas eu não vejo mal em fazer isso.
Eu só não criaria uma chave composta, porquê tenho nojo de trabalhar com chave composta com Hibernate.
Abraço!

romarcio

Não sei como funciona o PostgreSql, mas no Oracle a sequencia é uma coisa e o Id da tabela é outra.
Então acho que não entendi muito bem o que você quer fazer.

jingle

o que eu quero é passar o ID e ele salvar no banco com o ID que eu informei,
exemplo:

...
atributo.setID(1) ;
atribudoDAO.save(atributo);
....

Ele ignora meu id que informei, e pega o próximo na sequence que mapiei no modelo, que é o que deve fazer normalmente quando não informo o ID. mas informando o ID gostaria que ele utiliza o que passei.

model

@Id
	@SequenceGenerator(name = "sequence", sequenceName = "seq_atributo")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence")
	private Long id;
romarcio

Você não vai conseguir fazer isso por que setou “strategy = GenerationType.AUTO”. Assim você perde o controle sobre a geração dos Id’s.

jingle

e tem alguma estrategia que, ele só fique auto quando não informo o id?

romarcio

Pelo que sei não. Ou um ou outro.

Criado 17 de agosto de 2011
Ultima resposta 17 de ago. de 2011
Respostas 8
Participantes 3