Quando precisamos modelar uma relação Many-To-Many com grails, podemos fazer de algumas formas diferentes.
A maneira que eu prefiro fazer é criar uma classe responsável por unir as duas tabelas. Imagine essa relação:
- Um cliente pode ter muitos planos
- Um plano pode ser de muitos clientes
De forma resumida, podemos ter as classes cliente e plano assim:
 
Java Code
class Cliente {
    String nome
    static hasMany = [clientesPlano: ClientePlano]
 
}
class Plano {
    String descricao
    Double valor
    static hasMany = [clientesPlano: ClientePlano]
 
  
Observe o atributo hasMany de ambas as classes. A classe ClientePlano irá relacionar,  dessa forma:
Java Code
class ClientePlano {
    Cliente cliente
    Plano plano
}
  
O benefício de modelarmos dessa forma é que podemos encapsular responsabilidades na classe ClientePlano, possibilitando um melhor controle.
Por exemplo, podemos criar métodos estáticos responsáveis por salvar e remover, a classe ClientePlano ficaria assim:
Java Code
class ClientePlano {
    Cliente cliente
    Plano plano
    static ClientePlano link(cliente, plano) {
        def cp = new ClientePlano()
        cliente.addToClientesPlano(cp)
        plano.addToClientesPlano(cp)
        cp.save()
    }
    
    static ClientePlano unlink(cliente, plano) {
        def cp = ClientePlano.findByClienteAndPlano(cliente, plano)
        if(cp) {
            cliente.removeFromClientesPlano(cp)
            plano.removeFromClientesPlano(cp)
            cp.delete()
        }
    }
}
  
Quem precisar salvar e remover planos, peça para a class ClientePlano, dessa forma:
Java Code
// ids 1 de exemplo
def plano = Plano.read(1)
def cliente = Cliente.read(1)
ClientePlano.link(cliente, plano)
 Modelado dessa forma, seria fácil implementar e encapsular novas funcionalidades, como limite de clientes por plano.
 
Até a próxima!