Primary key do tipo string
23/04/2012 15:08
0
Bom dia pessoal do forum!

Estou com um problema aqui no serviço, já fazem duas semanas que estou tentando resolver este problema e não tenho obtido êxito.

Não estou conseguindo cadastrar um objeto no banco . Uso como banco de dados o PostgreSql, além do ZK(Interface) e o Grails.
Aparentemente estou tendo um problema com primary key, esta chave primaria tem que ser do tipo char, pois é o id da minha tabela como vocês podem ver abaixo.

a tabela do meu banco de dados será descrita abaixo:

-- Table: comum.ramodeatividade
-- DROP TABLE comum.ramodeatividade;

CREATE TABLE comum.ramodeatividade
(
id_ramo character varying(14) NOT NULL,
nome character varying(255),
ativo boolean,
"version" bigint DEFAULT 0,
uid character varying(255),
CONSTRAINT ramodeatividade_pkey PRIMARY KEY (id_ramo)
)
WITH (
OIDS=TRUE
);
ALTER TABLE comum.ramodeatividade OWNER TO elit;

Esta é a tabela do meu BD.

A classe que faz ligação com o grails é a seguinte:

package elit.comum
class RamoDeAtividade {

String id //definindo um atributo id como String

static transients = ['idRamo']
void setIdRamo(String idRamo)
{
id = idRamo
}

String getIdRamo()
{
return id
}

String nome
Boolean ativo
String uid //descomentar esta linha

static constraints = {

id nullable: false
nome(nullable: true, maxSize:255)
ativo(nullable: true)
uid(nullable: true)
}

static mapping = {

table schema: 'comum', name:'ramodeatividade'
version false
id column: 'id_ramo', generator:'assigned'//voltar aqui
nome column:"nome"
ativo column:"ativo"
uid column:"uid"
}

String toString()
{
"$nome"
}
}

Quando eu rodo a aplicação através do seguinte comando:
run-app

é sugerido o seguinte endereço:

http://localhost:8080/daniel

Daí eu clico em no controller em questão....

Aparece aquela interface CRUD básica do GORM, e através desta interface eu consigo, alterar, remover, listar só não consigo criar, ou seja não consigo criar um novo registro.

E a mensagem que aparece no console é a seguinte:

Error 2012-04-23 11:34:33,314 [http-bio-8080-exec-1] ERROR ramodeatividade.CreateComposer - grails.validation.ValidationErrors: 1 errors
Field error in object 'elit.comum.RamoDeAtividade' on field 'id': rejected value [null]; codes [elit.comum.RamoDeAtividade.id.nullable.error
.elit.comum.RamoDeAtividade.id,elit.comum.RamoDeAtividade.id.nullable.error.id,elit.comum.RamoDeAtividade.id.nullable.error.java.lang.String
,elit.comum.RamoDeAtividade.id.nullable.error,ramoDeAtividade.id.nullable.error.elit.comum.RamoDeAtividade.id,ramoDeAtividade.id.nullable.er
ror.id,ramoDeAtividade.id.nullable.error.java.lang.String,ramoDeAtividade.id.nullable.error,elit.comum.RamoDeAtividade.id.nullable.elit.comu
m.RamoDeAtividade.id,elit.comum.RamoDeAtividade.id.nullable.id,elit.comum.RamoDeAtividade.id.nullable.java.lang.String,elit.comum.RamoDeAtiv
idade.id.nullable,ramoDeAtividade.id.nullable.elit.comum.RamoDeAtividade.id,ramoDeAtividade.id.nullable.id,ramoDeAtividade.id.nullable.java.
lang.String,ramoDeAtividade.id.nullable,nullable.elit.comum.RamoDeAtividade.id,nullable.id,nullable.java.lang.String,nullable]; arguments [i
d,class elit.comum.RamoDeAtividade]; default message [O campo [{0}] da classe [{1}] não pode ser vazia]

Além desta mensagem no console, no link:
localhost:8080/daniel/ramoDeAtividade/create

no campo id: a aparece a seguinte mensagem:
!O campo[id] da classe [class daniel.comum.RamoDeAtividade] não pode ser vazia
Tags: primary key


0
Olá, Daniel.

Amigo, quando a "id" é do tipo "tradiconal" (inteiro autoincremento) o Grails sabe o que fazer, ou seja, ou incrementa o valor ou passa essa tarefa ao SGBD.

Como teu "id" é String, o Grails "pensa": "blz, se é String o programador que se vire pra setar o valor quando for inserir um novo registro. Afinal, não posso fazer Autoincremento em String".

Assim, você deve definir o "id" antes de mandar salvar o novo registro, entendeu? ;)


0
Boa tarde José!

Pelo o que andei lendo na documentação, o grails só entende id como autoincremento. E este não é o meu caso. Tenho como chave primária uma string.

Como eu faço pra definir o "id" antes de mandar salvar no registro? Não ficou claro pra mim, você poderia me explicar melhor?


Atencisoamente,
Daniel

23/04/2012 18:07


0
Olá, Daniel.
o grails só entende id como autoincremento

Não é que ele "só entende", mas sim ele "tem como padrão" o id como inteiro e autoincremento.

Ora, pense o seguinte: se você diz pro GORM que tua chave pe String, pra ele você vai guargar texto. Como ele vai adivinhar o que você quer colocar lá?

Quando se trabalha com inteiro, é fácil... 1, 2, 3... E texto? Mesmo o nome do campo sendo "id", ele é String, portanto pode receber "1","2","3", "lady gaga", "adele", "corinthians", etc.

Assim, você tem que preencher manualmente esse campo, afinal é texto e não número, entendeu?



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