usuário informando o ID
18/09/2009 00:00
0
olá galera!

me deparei com um problema que acredito ter uma solução simples, mas que eu não to conseguindo encontrar.

é o seguinte, tenho a tabela:

CREATE TABLE dbo.alunos
(
id NUMERIC (19) NOT NULL UNIQUE,
nome VARCHAR (255) NOT NULL,
)


o id não deve ser auto-increment, defini como generator:'assigned' no domain, mas não to sabendo como deixar possivel para que o usuário digite o id, ao invés de controlar pela aplicação.

a tela de 'create aluno' deve ter tanto o campo nome quanto o ID para ser inserido.

ja tentei da conforme descrito aqui: <!-- m --><a class="postlink" href="http://jira.codehaus.org/browse/GRAILS-2775">http://jira.codehaus.org/browse/GRAILS-2775</a><!-- m --> e aqui: <!-- m --><a class="postlink" href="http://grailsbrasil.com/viewtopic.php?f=1&amp;t=346&amp;hilit=assigned">http://grailsbrasil.com/viewtopic.php?f ... t=assigned</a><!-- m --> mas não funcionou.

alguem sabe me dizer como fazer isso?

obs: o campo para usar como id assigned na tabela tem que ser representado por ID mesmo.
Tags: Grails


0
Já fiz algo similar, porém usando geração uuid.

Aqui está como mapear a chave primária de sua classe de modo customizado:
<!-- m --><a class="postlink" href="http://grails.org/doc/latest/ref/Database%20Mapping/id.html">http://grails.org/doc/latest/ref/Databa ... ng/id.html</a><!-- m -->


0
Então kicolobo, eu ja tentei dessas formas também.
Até consegui chegar quase lá mas tive que alterar a create.gsp e a função save.

Ficaram assim:

Domain:

class Alunos {
int id
String nome

static mapping = {
id generator&#58;'assigned', column&#58;'id'
version false
}

static constraints = {
id(size&#58;3..10, blank&#58;false, unique&#58;true)
nome(size&#58;5..50, blank&#58;false, unique&#58;true)
}
}


Função save: (só adicionei a terceira linha)
def save = {
def alunosInstance = new Alunos(params)
alunosInstance.id = Integer.parseInt(params.id)


create.gsp: (tive que adicionar isso)

<tr class=&quot;prop&quot;>
<td valign=&quot;top&quot; class=&quot;name&quot;>
<label for=&quot;id&quot;>id&#58;</label>
</td>
<td valign=&quot;top&quot; class=&quot;value ${hasErrors(bean&#58;alunosInstance,field&#58;'id','errors')}&quot;>
<input type=&quot;text&quot; id=&quot;id&quot; name=&quot;id&quot; value=&quot;${fieldValue(bean&#58;alunosInstance,field&#58;'id')}&quot;/>
</td>
</tr>


Eu não queria ter que estar alterando codigo das view, mas tudo bem, é pouca coisa.

Ok, até aí ta inserindo, só que surgiu mais um problema, a validação não funciona pro campo id.
Como o id tem que ser unique, quando o usuario digitar um id repetido, deveria aparecer a msg própria do grails assim como apareceu para o campo nome...
Mas não, a aplicação fica travada, gerando o erro de violação de campo unique pelo banco.
¬¬'

vlw
18/09/2009 00:00


0
erhorn,

Tenta fazer isso:
class Alunos {
@Id Long identity
(...) }


Se você nao quer alterar o código gerado pelo scaffold você pode alterar o template que o scaffold usa.
É só usar grails install-templates, procurar e remover o 'id' dos &quot;excludedProps&quot; nos templates(src/templates/scaffolding/edit.gsp e create.gsp)
20/09/2009 00:00


0
Pessoal tenho o mesmo problema do erhorn

tenho uma tabela onde não existe primary key, e eu controlo os códigos por unique,

a solução que o erhorn propos funcionou, mais não funcionou a validação na tela pro campo id, ficando o servidor em looping.

quero saber se tem algo que possa ser feito, ou alguma maneira diferente???

O que preciso é o seguinte:

minha tabela

tabela produto:
id not null unique e nome string (50), e os demais campos.....

na minha tela preciso digitar este código e o nome, sendo que o id não é auto incremento e preciso informar ele na mão.

abraços.
21/09/2009 00:00


0
[quote=&quot;Raphael&quot;]erhorn,

Tenta fazer isso:
class Alunos {
@Id Long identity
(...) }


Se você nao quer alterar o código gerado pelo scaffold você pode alterar o template que o scaffold usa.
É só usar grails install-templates, procurar e remover o 'id' dos &quot;excludedProps&quot; nos templates(src/templates/scaffolding/edit.gsp e create.gsp)[/quote]

Tentei dessas formas Raphael, a 1ª não sei como fazer, @id Long identity fica como erro de codigo, e alterar o template não me vai ser util.

agora fiz da seguinte forma e funcionou:

Tabela:
CREATE TABLE dbo.alunos
(
id_aluno INTEGER NOT NULL,
nome VARCHAR (255) NOT NULL,
PRIMARY KEY (id_aluno)
)
GO


Domain:
class Alunos {
Integer id_aluno
String nome

static mapping = {
table &quot;alunos&quot;
id name&#58;&quot;id_aluno&quot;, generator&#58;&quot;assigned&quot;
version false
}

static constraints = {
id_aluno(blank&#58;false, unique&#58;true)
nome(size&#58;5..50, blank&#58;false, unique&#58;true)
}
}


O create gerou bem do jeito que eu queria mas no list tive que apagar a referencia ao id, pois tinha tanto o id quanto o id_aluno e eu só preciso do 2º.

Agora consegui inserir e a validação pra unique e blank:false funcionou, mas...
Não há o que faça o show funcionar. Ta retornando o seguinte erro:

org.codehaus.groovy.runtime.InvokerInvocationException&#58; org.springframework.orm.hibernate3.HibernateSystemException&#58; Provided id of the wrong type for class Alunos. Expected&#58; class java.lang.Integer, got class java.lang.Long; nested exception is org.hibernate.TypeMismatchException&#58; Provided id of the wrong type for class Alunos. Expected&#58; class java.lang.Integer, got class java.lang.Long


ja tentei colocar:
&quot;def alunosInstance = Alunos.get( params.id.toLong() )&quot;
ou
&quot;def alunosInstance = Alunos.get( params.id.toInteger() )&quot;

alguma ideia do que fazer agora?
21/09/2009 00:00


0
Simplesmente o código Aluno.get(params.id) não funciona?

Dica: o Groovy Console é seu amigo. Experimente nele para ver o que acontece.


0
Exatemente kicolobo.
Coloquei uns println para ver como o params.id tava vindo e tudo ok.

É esse erro que ta ocorrendo
org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.orm.hibernate3.HibernateSystemException: Provided id of the wrong type for class Alunos. Expected: class java.lang.Integer, got class java.lang.Long; nested exception is org.hibernate.TypeMismatchException: Provided id of the wrong type for class Alunos. Expected: class java.lang.Integer, got class java.lang.Long


Pelo que entendi, ele ta recebendo um Long onde deveria ser Integer. Acredito que seja algum bug do grails, só pode, pois tanto no meu domain, quanto na tabela do banco ta como Integer.

Dica: o Groovy Console é seu amigo. Experimente nele para ver o que acontece.

Não tenho conhecimento desse Groovy console ainda, vou dar uma pesquisada como funciona.

Valeu pela atenção!
21/09/2009 00:00


0
Vamos entar uma gambiarra então?

AVISO: gambiarra abaixo:

implemente os métodos get e set do seu id com long mesmo.

Em seguida, verifique no seu banco de dados qual o tipo que está definido no mesmo. Se bobear, você está passando valores maiores do que os esperados pela tabela, o que gera o seu erro.


0
Utilizei o console, interessante..

Testei com uma classe onde a tabela possiu id identity sem muito mapeamento. Retorou a linha que eu pesquisei.

Nessa classe Aluno que estou tendo problemas, ele retorna sempre null. Deve ser esse o problema. Mesmo eu mapeando para o id apontar para id_aluno, não está funcionando corretamente =/

To bem perdido agora, imaginei que seria muito simples criar um CRUD onde o usuario informasse o id ao invez da aplicação ou do banco gerar mas me enganei.
Preciso mesmo que isso de certo porque estamos migrando um sistema legado, e há tabelas que não devem ter campo auto-increment...
21/09/2009 00:00


0
Erro de código?

Voce importou o Id?
import javax.persistence.Id;
22/09/2009 00:00


0
[quote=&quot;Raphael&quot;]Erro de código?

Voce importou o Id?
import javax.persistence.Id;[/quote]

hmm não tinha conhecimento disso ainda Raphael.
Ainda não usei dessa forma, depois vou tentar.
Por enquanto tive que abandonar isso e seguir em frente com outras telas..
mas vou verificar depois desse jeito que você passou!

Obrigado!
22/09/2009 00:00



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