Datanucleus (JDO) – Herencia de clases

agosto 8, 2012

En orientación a objetos la herencia es, después de la agregación o composición, el mecanismo más utilizado para alcanzar algunos de los objetivos más preciados en el desarrollo de software como lo son la reutilización y la extensibilidad. A través de ella los diseñadores pueden crear nuevas clases partiendo de una clase o de una jerarquía de clases preexistente (ya comprobadas y verificadas) evitando con ello el rediseño, la modificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos) y eventualmente los atributos (variables) de su superclase.

En nuestros objetos es fácil implementar la herencia, basta con agregar la palabra clave extends y específicar la clase padre. Pero en una base de datos relacional no siempre queda claro cómo debemos implementar la herencia. Datanucleus (JDO) nos ofrece 4 opciones:

  1. Cuando cada clase tiene su propia tabla en la base de datos: new-table
  2. Cuando los campos de la clase padre son almacenados en la tabla del hijo: subclass-table
  3. Cuando los campos del hijo son almacenados en la tabla del padre: superclass-table
  4. A partir de JDO3.1, cuando cada clase tiene su propia tabla y esta contiene todos los campos (incluídos los de la clase padre): complete-table

Supongamos que tenemos la entidad Trabajador de la cual derivan las entidades Empleado y Meritorio. Nuestras clases quedarían de la siguiente manera:

public abstract class Trabajador {
   private String id;
   private String departmento;
}
public class Empleado extends Trabajador {
   private float salario;
}
public class Meritorio extends Trabajador {
   private Date fechaTermino;
}

Las tablas para las distintas estrategias que ofrece Datanucleus (JDO) serían:

new-table

Trabajador
id departamento
Empleado
idTrabajador salario
Meritorio
idTrabajador fechaTermino

subclass-table

Empleado
id departamento salario
Meritorio
id departamento fechaTermino

superclass-table

Trabajador
id departamento tipo salario fechaTermino

complete-table

Trabajador
id departamento
Empleado
id departamento salario
Meritorio
id departamento fechaTermino

Finalmente mostraré cómo anotar nuestras clases para implementar la estrategia superclass-table, que es el caso particular que se me presentó.

@PersistenceCapable
@Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP, column="tipo")
public abstract class Trabajador {
   private String id;
   private String departmento;
}
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE)
@Discriminator(value="EMPLEADO")
public class Empleado extends Trabajador {
   private float salario;
}
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE)
@Discriminator(value="MERITORIO")
public class Meritorio extends Trabajador {
   private Date fechaTermino;
}

Fuentes:

http://www.datanucleus.org/products/datanucleus/jdo/orm/inheritance.html#superclasstable
http://www.datanucleus.org/products/accessplatform/jdo/orm/inheritance.html
https://developers.google.com/appengine/docs/java/datastore/jdo/dataclasses#Inheritance
http://es.wikipedia.org/wiki/Herencia_(programaci%C3%B3n_orientada_a_objetos)

Anuncios

Una respuesta to “Datanucleus (JDO) – Herencia de clases”

  1. alex Says:

    podrias postear el segundo caso de subclass-table


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: