Consultar nextval de DomainClass.id
01/10/2015 16:18
0
Tenho que montar um número de protocolo para uma classe, e no final desse número quero inserir o valor do id gerado pela sequence no banco.

Existe alguma forma de consultar o nextval de uma sequence no groovy? Tipo objeto.getNextVal() ou coisa assim?

Valeu! ?
Tags: sequence nextval groovy consulta


2
Olá Victor,
  Não sei como se obtém o valor do próximo id, mas gostaria de, talvez, tentar amadurecer mais sua ideia, vamos lá:
  Mesmo que você consiga obter o valor do próximo id, você não tem a garantia de que este valor será o que vai ser inserido na sua domain pq outros objetos podem ser salvos no intervalo de tempo entre vc ter obtido o valor e a domain ter sido de fato persistida.
  Para resolver seu problema acho que tem algo mais simples e eficaz: Gere seu protocolo  sem o id e adicione a concatenação do id em um bloco afterInsert da sua domain.
Espero ter ajudado.
01/10/2015 17:01


0
Bela resposta Dyego.

Realmente Victor, você tem de ficar esperto com a questão da concorrência. Nada impede que existam duas ou mais transações em execução ao mesmo tempo para você. A solução do Dyego é a dieal.


2
Chamem-me de purista, mas salvar um objeto com um campo necessario em branco (ou com qualquer valor padrão)  para logo depois preencher o campo e enfim salvar o objeto definitivamente também não me parece legal.
Dá para detalhar melhor o problema? Qual o formato deste protocolo? Precisará fazer queries baseadas nele? A parte "não id" do protocolo será uma constante?
A principio eu veria a possibilidade de usar uuid, ou algo como isso:

class Foo {
    String getProtocolo() { "abcxpto123$id" }
}

Ou:

class Foo {
    String protocolo
    static mapping = [
        protocolo formula: 'abcxpto123' || id
    ]
}
Com as soluções acima, tenha em mente que se você precisar alterar a chave do registro no banco de dados por seja lá qual for o motivo, o protocolo vai mudar junto.

Em último caso você tambem pode marcar o id como "assigned" no mapeamento, obter o valor do sequence manualmente, e você mesmo atribui este valor ao ID e ao protocolo.
Uma vez que você obteve o valor de uma sequence, nenhum outro acesso irá obter aquele mesmo valor, portanto pode ser usado de forma segura

Para obter o valor da sequence, você pode acessar o dialect do banco de dados utilizado na configuração do datasource e ele terá um método que retorna o SQL apropriado para realizar a consulta, daí é só executar direto num Connection. Eu colocaria isso numa classe a ser injetada onde quer que você precise desta funcionalidade, assim fica facil de testar depois


0
Outra solução interessante é ter um serviço apenas para gerar o identificador pra você.


0
Concordo. Também tinha pensado nesse problema da concorrência e também não acho legal a solução de salvar e atualizar o objeto com o id gerado.

Optei por uma solução parecida com a do Magno.

Na entidade:
String getProtocolo(){
def dia = dataSolicitacao.getAt(Calendar.DAY_OF_MONTH)
def mes = dataSolicitacao.getAt(Calendar.MONTH) + 1
def ano = dataSolicitacao.getAt(Calendar.YEAR)
String.format( "%010d", ("${id}" + "${dia}" + "${mes}" + "${ano}").toInteger() );
}


Ou seja, não persisto o protocolo, apenas gero ele quando for exibido. Formato: id+data completando com zeros a esquerda até formar um número de 10 caracteres.

Obrigado povo.


1
Só tem um problema: Você pode acabar com protocolos iguais para objetos diferentes, isto é aceitavel no seu cenario?
Exemplo:
Id=1, dataSolicitacao = 1/11/2015, protocolo = 0011112015
id=11, dataSolicitacao = 1/1/2015, protocolo = 0011112015


0
Magno você tem razão. Nem tinha previsto essa situação.

Na verdade eu já não estava satisfeito com essa solução, pois além de exibir eu posso um dia querer consultar por protocolo também. Fora também que o protocolo deve ser imutável.

Estou propenso a utilizar um UUID mesmo ou algo parecido. Quando decidir eu comento aqui a solução definitiva.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto