[hibernate] usar generator em property (nao id)

4 respostas
Insonia

Pessoal,
meu conhecimento em hibernate é um tanto qto limitado, por isso desculpem-me caso essa pergunta for muito estúpida.

Li na documentacao de referencia que o elemento ‘generator’ só pode ser usado em PKs :frowning:

A minha tabela possui um atributo que cuida da ordenacao dos registros. Este atributo [no insert] deve ser preenchido com o valor da maior ordenacao + 1.

A forma mais convencional que eu pensei seria, antes de inserir, verificar qual o maior valor [entre os registros já existentes] e atribuir ao novo registro o maior valor + 1. Porem, achei esse metodo um tanto qto inseguro [se a busca e insert nao fizerem parte de uma regiao crítica].

Como isso poderia ser feito utilizando o hibernate? Ou seja: posso delegar para o hibernate a tarefa de atribuir ao novo registro o valor da maior ordem + 1?

Acho que a ideia é um tanto quanto parecida com o que o elemento generator pode fazer para ids. Porem, no meu caso a ordenacao nao faz parte da pk da tabela.

Alguem já passou por isso? Alguma sugestão?

4 Respostas

F
<id name="id" type="java.lang.Long">
            <column name="BLA_ID_BLA" />
            <generator class="sequence">
				<param name="sequence">BLA_SEQ_ID</param>
			</generator>
        </id>

Esse generator tem que ser criado no banco. Pode ser criado assim:

create sequence BLA_SEQ_ID

ou com um numero determinado

create sequence BLA_SEQ_ID start with 100 (a sequencia ira começar em 100)

Depois disso o hibernate faz tudo sozinho.

Insonia

Olá Fernando, obrigado pela sua resposta.

Pelo que eu li na documentaçao de referencia (5.1.4 - id), a tag <id> serve para mapear a Primary Key da tabela.

No meu caso [pelo que eu entendi] nao devo (posso??) utilizar o elemento generator justamente pelo fato da minha propriedade nao fazer parte da PK da tabela :frowning:

Minha tabela é simples:

  • ID (pk)
  • NOME
  • POSICAO

O atributo POSICAO serve para informar a ordem de visualizacao de cada registro da tabela (como uma fila). Essa ordem pode ser alterada e, na criacao de um novo registro, deve possui o valor da maior POSICAO existente, acrescido de 1 (garantindo assim que novos registros serao enviados para o fim da fila)

Como posso utilizar o hibernate para atribuir o valor de POSICAO + 1 durante o insert? Terei mesmo que utilizar a propriedade POSICAO como PK da tabela (<id>) para que o hibernate possa realizar essa atribuicao automaticamente durante o INSERT?

Obrigado

F

Insônia,

Não tinha me atentado ao fato dele nao ser PK.

Eu não conheco uma maneira de fazer com que o hibernate faça isso que vc quer.

Eu particularmente faria um:

select max(posicao)+1 as posicao from tabela

Um pouco antes do commit.

Insonia

Olá Fernando,
obrigado pela sua resposta.

Pela falta de posts, acredito que seja esta a única solução existente :frowning:

Abraços!

Criado 4 de janeiro de 2007
Ultima resposta 4 de jan. de 2007
Respostas 4
Participantes 2