Erro no Bootstrap - Banco de Dados Postgres
11/10/2012 13:00
0
Estou com um problema no uso do banco de dados do Postgres. Uso o Mysql normalmente em minha aplicação e ao migrar para o PostgresSQL ocorre o erro ao persistir no banco de dados. As tabelas são criadas porém quabndo o bootstrap vai inserir dados nas tabelas ocorre o erro:

| Error 2012-10-11 09:43:56,795 [pool-5-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: Validation Error(s) occurred during save():
- Field error in object 'com.app.tab.Cidade' on field 'estado': rejected value [null]; codes [com.app.tab.Cidade.estado.nullable.error.com.app.tab.Cidade.estado,com.app.tab.Cidade.estado.nullable.error.estado,com.app.tab.Cidade.estado.nullable.error.com.app.tab.Estado,com.app.tab.Cidade.estado.nullable.error,cidade.estado.nullable.error.com.app.tab.Cidade.estado,cidade.estado.nullable.error.estado,cidade.estado.nullable.error.com.app.tab.Estado,cidade.estado.nullable.error,com.app.tab.Cidade.estado.nullable.com.app.tab.Cidade.estado,com.app.tab.Cidade.estado.nullable.estado,com.app.tab.Cidade.estado.nullable.com.app.tab.Estado,com.app.tab.Cidade.estado.nullable,cidade.estado.nullable.com.app.tab.Cidade.estado,cidade.estado.nullable.estado,cidade.estado.nullable.com.app.tab.Estado,cidade.estado.nullable,nullable.com.app.tab.Cidade.estado,nullable.estado,nullable.com.app.tab.Estado,nullable]; arguments [estado,class com.app.tab.Cidade]; default message [O campo [{0}] da classe [{1}] não pode ser vazia]

Message: Validation Error(s) occurred during save():
- Field error in object 'com.app.tab.Cidade' on field 'estado': rejected value [null]; codes [com.app.tab.Cidade.estado.nullable.error.com.app.tab.Cidade.estado,com.app.tab.Cidade.estado.nullable.error.estado,com.app.tab.Cidade.estado.nullable.error.com.app.tab.Estado,com.app.tab.Cidade.estado.nullable.error,cidade.estado.nullable.error.com.app.tab.Cidade.estado,cidade.estado.nullable.error.estado,cidade.estado.nullable.error.com.app.tab.Estado,cidade.estado.nullable.error,com.app.tab.Cidade.estado.nullable.com.app.tab.Cidade.estado,com.app.tab.Cidade.estado.nullable.estado,com.app.tab.Cidade.estado.nullable.com.app.tab.Estado,com.app.tab.Cidade.estado.nullable,cidade.estado.nullable.com.app.tab.Cidade.estado,cidade.estado.nullable.estado,cidade.estado.nullable.com.app.tab.Estado,cidade.estado.nullable,nullable.com.app.tab.Cidade.estado,nullable.estado,nullable.com.app.tab.Estado,nullable]; arguments [estado,class com.app.tab.Cidade]; default message [O campo [{0}] da classe [{1}] não pode ser vazia]

Line | Method
->> 109 | doCall in BootStrap$_closure1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 301 | evaluateEnvironmentSpecificBlock in grails.util.Environment
| 294 | executeForEnvironment . . . . . in ''
| 270 | executeForCurrentEnvironment in ''
| 334 | innerRun . . . . . . . . . . . . in java.util.concurrent.FutureTask$Sync
| 166 | run in java.util.concurrent.FutureTask
| 1110 | runWorker . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . . . . . . . . . . . . in java.lang.Thread

Process finished with exit code 1


Minha configuração de dataSource esta assim:

environments {
development {
dataSource {

dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''

url = "jdbc:postgresql://localhost:5432/app"
driverClassName = "org.postgresql.Driver"
dialect = org.hibernate.dialect.PostgreSQLDialect
//url = "jdbc:mysql://localhost:3306/app"
username = "app"
password = "app123"

}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
username = "sa"
password = ""
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:postgresql://localhost:5432/app"
driverClassName = "org.postgresql.Driver"
username = "postgres"


pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}



As tabelas são criadas porém nenhum dado é persistido.

Já atualizei a JDBC4 e o Postgres e mesmo erro continua. E o mais estranho é que se eu coloco no banco de Dados MySQL ele não dá nenhum erro.
Tags: postgres, bootstrap, banco de dados,


1
Oi IvgSilva, o problema não está na sua configuração do banco de dados, mas sim no seu script do Bootstrap. Ele inicialmente persiste uma série de cidades e estados pelo que estou vendo, certo?

O que tá rolando é que a sua entidade Cidade requer um relacionamento com Estado, porém o estado ainda não existe, razão pela qual está dando erro de validação no bootstrap.

Realmente, não vai dar problema na hora de criar as tabelas, porque isto ocorre antes do seu script de inicialização.


0
Ola Henrique,

foquei em meu bootstrap e alterei o parametro de save(). Antes estava usando 'save(failOnError: true)' e estava apresentando este problema. Agora estou usando 'save(flush: true)' que força a persistência no banco de dados e este problema foi resolvido.

Porém ao analisar o banco percebi que a numeração dos ID's criados em cada tabela não estão sendo reiniciadas na mudança por outra tabela. Por exemplo, foi foi criado 3 registros na 'tabela1' sendo a contagem do ID de 1 a 3. Quando inserido um objeto de outra classe em outra tabela, o ID deveria ser iniciado para aquela tabela, porém ele segue a sequencia do anterior e quando é persistido o objeto na 'tabela2' ao invés dele iniciar com 1 o ID continua a contagem a partir do 4. Também percebi algumas mudanças como no Mysql o false é preenchdio com '0', no Postgres é preenchido com 'false'. É possível seguir o mesmo padrão do Mysql no Postgres?

11/10/2012 13:59


0
Oi IvgSilva,

eu observei este tipo de comportamento também: ao invés de ter um contador por tabela, o Hibernate usa um contador único para todas as tabelas. Se não me engano, há como você configurar para que fique similar ao MySQL, mas ainda não descobri como (mas desconfio que deve ser algo bem banal).

No caso, já dou até o primeiro passo: vai consistir em modificar o bloco mapping das suas classes de domínio.


1
Ola henrique!

consegui resolver parte do problema com a criação de um dialeto personalizado.

Apenas para ajudar a galera que passar pelo mesmo impasse aqui vai o link com a dica: stackoverflow

Ainda não consegui resolver o problema do 'false' substituindo por '0', mas o contador foi resolvido.

Obrigado!
19/10/2012 12:34


0
Ola Ilmon!

se vc ver foi até eu quem postei esse problema lá. Estava tentando resolver a mesma questão do 'false' e do '0' para postar a resposta completa aqui.

Não sei se vc percebeu, mas o ID de algumas tabelas não ficam totalmente ordenados. Achei isso estranho, mas nada que uma simples configuração no Mapping não resolva.

Se conseguir resolver a questão do 'false' posta ai pra gente.

Abraço
19/10/2012 12:56



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