Lauro Becker

Java, Grails and other great things

Tag Archives: java grails groovy gorm workaround

Grails: Personalizando nomes de chaves estrangeiras

É comum trabalharmos em projetos onde não temos total controle sobre a base de dados, e nossos sistemas devem se adaptar ao modelo. Também não é incomum encontrarmos chaves primárias compostas para as tabelas – vantagens e desvantagens dessa abordagem estão fora do escopo deste post.

Onde há chaves primárias compostas, presume-se que teremos chaves estrangeiras compostas. E, se você está trabalhando com Grails, isso não é tão simples de mapear quanto deveria ser. Não até a versão 1.3.7, ao menos.

Passando pelos problemas relatados em http://jira.grails.org/browse/GRAILS-4504, resolvi criar um workaround, baseado na solução proposta pelo Burt Beckwith, enquanto a resolução definitiva não chega.

Adicione ao seu projeto o arquivo disponível em http://organico.svn.sourceforge.net/viewvc/organico/trunk/src/groovy/br/com/organicadigital/organico/hibernate/OrganicoAnnotationConfiguration.groovy?revision=92 e altere o DataSource.groovy:

import br.com.organicadigital.organico.hibernate.OrganicoAnnotationConfiguration;

dataSource {
    pooled = true
    driverClassName = "…"
    configClass = OrganicoAnnotationConfiguration
}

Para o exemplo descrito no JIRA do Grails, seria feito algo assim:

class DeliveryInstruction {
    String description
    IntervalType intervalType
    IntervalQuantity intervalQuantity

    static constraints = {
        description(nullable:false, blank:false, size:3..250)
        intervalType()
        intervalQuantity()
    }

    static mapping = {
        table   'mail_delivery_instruction'
        version false
        id      generator:'sequence', params:[sequence:'DELIVERY_INSTR_SEQ']
        columns {
            id               column:'code'
            intervalType     column:'interval_type_code'
            //intervalQuantity column:'interval_quantity'
            description      column:'description'
        }
    }

    String toString() {
        return description
    }

    static foreigners = [
        intervalQuantity : [intervalType : "interval_type",
                          quantity: "interval_quantity" ]
    ]
}

O atributo foreigners é um mapa. Cada item deste mapa possui uma chave String (intervalQuantity) e os valores são outro mapa ([interval_type : “interval_type”, quantity: “interval_quantity” ]).

A chave intervalQuantity é o nome da propriedade que define o relacionamento. intervalType é o nome da FK sugerida pelo Grails, e interval_type o novo nome. Ok, ok, nesse exemplo não foi nada alterado… mas observe o atributo quantity.

É algo experimental, mas já foi testado em produção. 😉

Advertisements