Classes abstratas e banco de dados
16/07/2014 15:56
0
Prezados membros,
Sou novo no grails e em processo de familiarização.
A base de dados do meu aplicativo possui uma tabela abstrata que representa um "elemento do meu negócio".
Para a minha surpresa, quando o grails gera o banco de dados (H2 neste caso) está ocorrendo os seguintes comportamentos indesejáveis:

1) A classe abstrata é criada na base de dados
2) As classes que estendem a classe abstrata não são criadas na base de dados (conferi inclusive na tabela INFORMATION_SCHEMA.TABLES
3) A classe abstrata contém a união de todas as colunas das tabelas estendidas.

Será que vocês já utilizaram um modelo de dados com classes abstratas e podem me orientar neste assunto?

Obrigado

Pedro Gentil


Tags: dbconsole, H2, abstract class, extends


1
Olá Pedro, Bem vindo ao Grails!
vamos ao seu problema:
1)Deveria ter ocorrido erro na hora que você tentou instanciar a classe abstrata: "You cannot create an instance from the abstract class MinhaClasseAbstrata". Testei agora no groovy console e isso gera um erro, logo vc nem vai chegar a conseguir tentar dar um save() nesse objeto. Sua classe é mesmo abstrata?

2 e 3) Por padrão o grails cria uma única tabela no BD para salvar todas subclasses de uma classe, mais detalhes aqui. Caso não queira este comportamento, basta modifica-lo conforme descrito no link.
16/07/2014 19:55


1
Oi Pedro,

é exatamente o que o Dyego lhe disse: por padrão, o Grails usa uma estratégia ao lidar com herança chamada "table per hierarchy". Esta estratégia diz o seguinte: se você tem uma classe abstrata, e tem mais de uma derivada, então todos os campos destas classes derivadas, assim como os da classe abstrata irão estar presentes na mesma tabela.

Então, imagina o seguinte: que você tem uma classe abstrata pessoa como a abaixo e duas derivadas tá?


abstract class Pessoa {
String nome
}

class PessoaFisica extends Pessoa {
String cpf
}

class PessoaJuridica extends Pessoa {
String cnpj
}


Vai ser criada uma tabela com seis campos: id, version, nome, cpf, cnpj e identifier. Esta identifier vai conter um texto que nos diz qual o tipo de Pessoa que está persistido.

Um problema desta abordagem é que você não pode ter campos que neguem valores nulos. Imagine que vai salvar, por exemplo, uma PessoaFisica, mas que o campo cnpj não aceita null. O banco de dados vai chorar.

Se este não for o comportamento que você deseja, basta que na sua classe matriz você inclua um bloco como no código abaixo:


abstract class Pessoa {
String nome

static mapping = {
tablePerHierarchy false
}
}


Com isto serão geradas três tabelas, uma para cada classe, com os seus devidos relacionametnos.


0
Caríssimos Diego e Henrique,
Estou muito agradecido pela sua pronta resposta e pelo esclarecimento!
Minha dúvida foi totalmente sanada.
Sucesso para vocês!
17/07/2014 09:48



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