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
En el ejemplo anterior tenemos una clase padre Content class and then various child classes with more specific behaviour.
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
A nivel de la base de datos, Grails mapeara una tabla-por-jerarquía e incluirá una columna discriminador llamada class so the parent class (Content) and its subclasses (BlogEntry, Book etc.), share the same table.
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
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 super class will return all subclasses of Content:
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 authordef podCasts = PodCast.list() // list only podcastsdef content = Content.list() // lista todas las entradas de blog, books y podcasts
content = Content.findAllByAuthor('Joe Bloggs') // encontrar todo por authordef podCasts = PodCast.list() // lista únicamente los podcasts
