Clovis Lemes Ferreira Junior
Base de Dados Legada sem ID
Seguinte, estou iniciando um trabalho na qual tenho uma base legada em MS Access e porém, existem algumas tabelas sem chave primária, ou seja, sem a columa "id".
Então vem a pergunta, como faço para dizer para o GORM para ele ignorar essa coluna?
Já tentei utilizar "static transients" e não funcionou.
Neste caso, cabem algumas perguntas:
1. Não tem nenhum campo nestas tabelas que identifiquem unicamente cada registro? Neste caso, tratam-se de tabelas que, por exemplo, simplesmente armazenam resultados de relatórios ou filhos que podem ter características identicas?
Se existir um campo chave, e este não se chamar id, é fácil de resolver, basta mapear o nome do campo, tal como neste exemplo:
id column:"coisas_da_vida"
Você pode inclusive alterar o tipo do campo se quiser, por exemplo, trabalhar com strings ou datas, ou qualquer outro formato.
Agora, mapear uma classe de domínio sem chave primária vai te causar alguns problemas, pois no caso do GORM, você está lidando diretamente com algumas convenções, dentre as quais, a presença obrigatória de chave primária.
O GORM injeta métodos como get, por exemplo, nas suas classes de domínio, estes de cara não funcionariam.
Aproveitando, outra dúvida: como você está fazendo para acessar a base Access com o Grails? Está usando algum dialeto especial? Seu sistema será executado apenas na plataforma Windows?
Poisé, é uma base em MS Access na qual não teve uma modelagem adequada.
A maioria das tabelas não tem nenhuma chave primária e nenhum relacionamento ( é um BANDO DE DADOS mesmo <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: --> )
Para acesso ao MS Access encontrei um Dialect implementado na qual não me deu nenhum problema por enquanto, visto que estou no inicio rsrs.
O Dialect se encontra em http&#58;//code.google.com/p/mesh4x/source/browse/Mesh4j/trunk/Mesh4j/src/org/mesh4j/sync/adapters/hibernate/msaccess/MsAccessDialect.java?r=1997
Até consegui contornar para funcionar a Action List, porém na hora de salvar ele gera o erro
java.sql.SQLException&#58; [Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe na instrução INSERT INTO.
O engraçado que olhando sql que o hibernate gera esta correto
INSERT INTO ENUMERATORS (enumerates, value, name) values (?, ? ,?)
Enumerates - INTEGER
mapei meu Domain assim:
class Enumerators{
Integer enumerates
id generator&#58; &quot;assigned&quot;, name&#58; &quot;name&quot;, type&#58; &quot;text&quot;
Estava esquecendo o complemento:
Para acessar a base com o Grails compilei o Dialect citado acima e coloquei na pasta src/java e alterei o DataSource.groovy adicionando a propriedade dialect apontando para o mesmo.
O sistema será executado na plataforma Windows mesmo.
Achei a biblioteca [url]http://jackcess.sourceforge.net/[url] para trabalhar como se fosse um driver embarcado independente da plataforma, realizei alguns testei e gostei, porém não consegui executar SQL da forma tradicional apenas utilizando a API.