Melhor forma de criar ID's incrementais nos EJB's

3 respostas
M

Olá, Pessoal!!

Apresento duas soluções para meu problema, seguido de um questionamento sobre os mesmos.

   Tenho uma boa experiência com EJB's, mas uma coisa me deixa "p" da vida... qual seria a melhor forma de criar ID's auto-incrementais (identity) com EJB's CMP?? Eu venho usando uma forma meio (pra não dizer bastante) tosca que é pegar todos os beans (um findAll) e pegar o size da coleção e adicionar um e tentar criar o bean com este valor. Para os casos em que uma exceção ocorre por chave duplicada, eu trato a exceção somando 1 ao que seria a ID anterior e repito o processo. Chega uma hora que o processo funciona (quando não funciona de primeira, claro...). Isso é muito ruim em casos onde muitas atualizações com remoções são realizadas no banco. 
   Outra forma seria usar um método do tipo ejbSelect, no qual se seleciona a maior ID já criada. Solução perfeita, se não fosse o fato da necessidade de se trabalhar com uma instância do bean (ou seja, é preciso pegar algum bean e fazer a consulta, retornando o valor... não é muito agradável!! Eu já usei coisa semelhante pra pegar outros dados... pra isso, eu criava um bean com um valor qualquer, pegava os dados que queria e a seguir deletava o bean - solução tosca!!). 
   Qual seria outra solução? Essas quebram o galho, mas perde-se em performance e em clareza, além de ser meio gambiarra. 

   Se alguém tem uma idéia, vamos discutir! Podemos encontrar outras soluções bem melhores, eu acredito. Ainda bem que não precisei fazer nada grande usando essas soluções :).

    Obrigado a todos!!

            Marcos J. Hermes

3 Respostas

M

Bem vc poderia montar uma tabela no seu banco de dados que guardaria o proximo ID livre. Assim quando alguem prescisasse de um ID ele buscaria nessa tabela usaria o ID e atualizaria o ID para ID + 1 na tabela. Só tem um porem para essa solução. Quando o acesso ao DB é muito grande se cria um gargalo para acessar essa tabela de ID. Mas até o que eu saiba melhor solução que essa só gerando ID não sequenciais a partir da data hora e clock do processador. Ai é garantido que não vai ter ID iguais é super rápido de ser gerado pois não acessa DB mas não é sequencial!

M

Cara, curti muito essa idéia de gerar números não-sequenciais por data, hora e clock… não é sequencial, mas é unico! Só uma dúvida… como fazer isso? E, se tu souber me responder, nunca, sob hipótese nenhuma, vai se repetir?

Muito obrigado e abração!!

            Marcos
M

Cara eu nunca fiz um algoritmo para fazer isso não! mas não deve ser dificil não. Eu dei essa ideia pois é isso que o Windows usa para atribuir Ids as coisas. Vc já observou que no registro do windows tem uns numeros tipo assim {d54ff454-44dfd4f5-fdfd545} então eles são gerados dessa forma! Ahhh e tem alguns frameworks de persistencia de dados que tem funcóes para gerar esses numeros (OIDs) eu só não sei se no hibernate tem! mas o tiOPF que é framework para Delphi tem isso, e funciona muito bem!.

Criado 6 de julho de 2004
Ultima resposta 9 de jul. de 2004
Respostas 3
Participantes 2