configurar "set null" no "on delete" da FK
04/10/2013 14:43
0
Olá Pessoal,
Estou precisando encontrar uma forma de fazer com que o grails, ao criar a FK para relacionar duas tabelas, coloque "set null" no "on delete". Alguém sabe como fazer? dá para fazer pelo "static mapping = {alguma_coisa_aqui}"?
Tenho uma classe X que possui relação "hasMany" com uma classe Y, preciso que ao deletar um objeto X que esteja relacionado com um objeto Y, a relação (FK) seja setada para NULL.

Vi algumas pessoas indicando usar o beforeDelete(), mas antes de partir para esta opção gostaria de saber se existe uma maneira nativa de deixar o "on Delete" como "set null" e resolver naturalmente o problema.
obs: exemplo do beforeDelete() pode ser obtido em http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping

Tags: relacionamento, mapping, GORM, FK


0
ja tentei
static mapping = {
y cascade: "null"
}
e
static mapping = {
y cascade: "none"
}
e não deu certo, continua "no action" no "on delete"
04/10/2013 15:17


0
Acho que o melhor a fazer é criar a restrição no banco mesmo.

Se estive usando os migration:

addForeignKeyConstraint(
baseColumnNames: 'column_name,
baseTableName: 'my_table',
constraintName: 'my_constraint_name',
onDelete: 'SET NULL'
)


0
A possível solução para o seu problema deve ser esta:


static mapping = {
Y insertable: false
Y updateable: false
}


Isso não define um valor padrão para a FK que geralmente não pode ser nula, assim quando fizer o delete da entidade basta dar um update nestes valores para NULL. Acredito que vai funcionar.


0
Obrigado Leandro, mas acho que da forma que sugeriu não dá certo pq a FK já é criada pelo grails, precisava fazer ele criar com o "set null" no "on delete" ou então editar a FK existente para esta configuração. Para criar outra constraint seria necessário deletar a já existente.

Carlos,
Tentei como você colocou, mas não funcionou. Mesmo assim, valeu pela tentativa ^^

Como não consegui resolver usando o próprio "on delete" do BD acabei optando pela opção de fazer pela controler mesmo, obtendo as instancias de todos "Y" associados ao objeto e setando "null" para a referência ao "X" em questão.

Outras sujestões continuam sendo bem vindas.
07/10/2013 11:58


1
Dyego, provavelmente você está deixando o grails criar a estrutura de banco de dados, e acredito que você terá problemas com o seu banco de dados quando entrar em produção (eu já tive e muitos).

Acredito ser bem, importante você utilizar as migrações de base de dados, que vai te tirar uma enorme dor de cabeça no futuro.

Neste link, está explicado melhor o que estou tentando te dizer.


0
Valeu Leandro,
Realmente não estava muito satisfeito com algumas coisas que o grails estava gerando, bem como o comportamento apresentado.
Vou estudar melho esse plugin e nivelar com a equipe aqui.

Valeu!
08/10/2013 14:44



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