Sequencia Coluna com Hibernate

17 respostas
altitdb

Boa tarde galera,

tenho 2 tabelas:

table01
idTable01 PK
//demais campos

table02
idTable02 PK
idTable01 FK
numero //problema é este campo

Tenho que fazer com que quando eu adicione um registro na table02 ela insira automaticamente um incremento no campo numero, por exemplo, quando eu inserir o primeiro registro ele salva o numero com 1, quando salvar o segundo salvo como 2.
Só que esse incremento no campo numero é feito conforme o idTable01, cada idTable01 tem sua sequencia que é criada automaticamente.

Quero que fique assim:

table02
idTable02 idTable01 numero
1 1 1
2 1 2
3 2 1
4 1 3
5 2 2
6 2 3

E assim por diante.

Alguem tem alguma ideia de como faço isso com hibernate?

Procurei e não encontrei nada, até mesmo porque não sei como chamar isso.

Obrigado.

17 Respostas

drsmachado

Não entendi direito.
O idTable01 é uma PK, logo, os valores dele não se repetem (A não ser que este seja um dos componentes de uma PK composta…).

Para mim, isso parece um relacionamento 1 : n, onde cada registro constante na table02 terá um respectivo na table01, mas cada elemento da table01 poderá estar associado a mais de 1 registro da table02, certo?

Sendo assim, é preciso informar ao hibernate (xml ou anotation) que isto ocorre…
Se for o caso, no guj existem vários exemplos.

Caso contrário, bem, uma trigger poderia ser disparada e realizar esta ação…

altitdb

drsmachado,

o idTable01 é uma PK normal sem ser composta.

Esse relacionamento 1:n eu consigo fazer tranquilamente.

O problema é o campo numero que citei ali em cima… ele deve incrementar a cada registro na Table02, só que cada idTable01 tem sua sequencia…

idTable02 idTable01 numero
1 x 1 x 1
2 x 1 x 2
3 x 2 x 1
4 x 1 x 3
5 x 2 x 2
6 x 2 x 3

Repare bem na coluna numero a sequencia dela vai conforme o da coluna idTable01

xD~~

drsmachado

Deixa eu entender, os valores do campo número são criados como?

Já existe uma PK para a table02?

altitdb

Já existe uma PK na Table02.

o campo numero que eu não sei como inserir automaticamente.

Ele seria do formato numérico, um Long mais precisamente.

drsmachado

Se a PK é o campo número e o objetivo é sequencia-lo (1, 2, 3, 4…), há, no mysql, a opção de colocá-lo como auto_increment. No sql server há o modificador identity.

altitdb

Não, o campo numero não é nem PK e nem FK, é um campo sem chave alguma.

drsmachado

Então o próprio SGBD, independente de qual seja, irá bloquear a incrementação automática (só válida para PK).

Ou você faz controle deste campo pela aplicação e cria um select antes de realizar a inserção ou usa uma procedure ou trigger para fazer isto (caso o bd esteja sob sua tutela)

altitdb

Você tem algum exemplo de Trigger com Hibernate??

Procurei, mais os que achei não tinha uma explicação clara!!

xD~~

drsmachado

Triggers são ações disparadas quando um determinado tipo de ação é feito no BD.
Normalmente ocorrem depois de um insert, delete ou update e eventualmente após um select.
Este “gatilho” tem funções limitadas de acordo com o bd q vc usa.

Vamos supor que seja mysql, você pode criar uma trigger que seja executada após a operação de insert e que execute a ação de incrementar o campo numero.

Qual o bd em uso?

altitdb

Eu consigo criar as triggers no banco, só que quando eu faço o insert pelo hibernate, ele gera uma exception.

Por isso queria criar uma trigger pelo hibernate.

Estou usando postgreSql

xD~~

drsmachado

Hum…
Qual a exception?

altitdb

HibernateException…

Agora não tenho o log, esses dias que criei a Trigger e tentei fazer esse processo.

Dai lançou exception dae tive que fazer outras coisas e hoje que estou voltando a ver isso.

drsmachado

Seria bom ter o erro, pra saber onde ele ocorre.

altitdb

vou criar a trigger aqui e vou postar o erro…

drsmachado

Não sei se chegou a ver, mas acho que isto pode te ajudar


http://www.guj.com.br/java/118429-trigger-com-hibernate–gatilho-no-hibernate-resolvido

altitdb

Consegui resolver criando uma trigger no banco mesmo.

Fiz a trigger no postgresql e funcionou direitinho, no dia que eu fiz, usei o mysql e não tinha dado certo, talvez tenha feito algo errado.

Obrigado pela ajuda.

drsmachado

Pode ser o grande problema do MySQL com triggers…

Criado 31 de janeiro de 2011
Ultima resposta 1 de fev. de 2011
Respostas 17
Participantes 2