(Quick Reference)

5.2.3 Herencia en GORM - Reference Documentation

Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith

Version: null

5.2.3 Herencia en GORM

GORM supports inheritance both from abstract base classes and concrete persistent GORM entities. For example:
GORM soporta herencia de clases base abstractas y de entidades GORM persistentes concretas: Por ejemplo:

class Content {
     String author
}

class BlogEntry extends Content {
    URL url
}

class Book extends Content {
    String ISBN
}

class PodCast extends Content {
    byte[] audioStream
}

In the above example we have a parent Content class and then various child classes with more specific behaviour.
En el ejemplo anterior tenemos una clase padre Content y varias clases hijo con un comportamiento más específico.

Considerations

Consideraciones

At the database level Grails by default uses table-per-hierarchy mapping with a discriminator column called class so the parent class (Content) and its subclasses (BlogEntry, Book etc.), share the same table.
A nivel de la base de datos, Grails mapeara una tabla-por-jerarquía e incluirá una columna discriminador llamada class, de esta forma la clase padre (Content) y las subclases (BlogEntry, Book etc.), comparten la misma tabla.

Table-per-hierarchy mapping has a down side in that you cannot have non-nullable properties with inheritance mapping. An alternative is to use table-per-subclass which can be enabled with the ORM DSL
El mapeado de tabla-por-jerarquía tiene la desventaja de que no permite definir propiedades no nulas. Una alternativa es utilizar una tabla-por-subclase que puede habilitarse mediante el DSL ORM

However, excessive use of inheritance and table-per-subclass can result in poor query performance due to the use of outer join queries. In general our advice is if you're going to use inheritance, don't abuse it and don't make your inheritance hierarchy too deep.
Sin embargo, el uso excesivo de herencia y de tabla-por-subclase, pueden dar lugar a un rendimiento deficiente de las consultas debido a la utilización de combinaciones externas en ellas. Nuestro consejo seria, si va a utilizar la herencia, no abusar de ella y no hacer la jerarquía de la herencia demasiado profunda.

Polymorphic Queries

Consultas polimórficas

The upshot of inheritance is that you get the ability to polymorphically query. For example using the list method on the Content super class will return all subclasses of Content:
Como resultado de la herencia se obtiene la capacidad de realizar una consulta polimórfica. Por ejemplo, al utilizar el método list de la super clase Content este devolverá todas las subclases de Content:

def content = Content.list() // list all blog entries, books and podcasts
content = Content.findAllByAuthor('Joe Bloggs') // find all by author

def podCasts = PodCast.list() // list only podcasts

def content = Content.list() // lista todas las entradas de blog, books y podcasts
content = Content.findAllByAuthor('Joe Bloggs') // encontrar todo por author

def podCasts = PodCast.list() // lista únicamente los podcasts