JPA nos ofrece varias soluciones para resolver jerarquias de objetos hacia el mundo relacional.
Estas propuestas  pueden ser útiles en la mayoría de los casos.
No obstante, la realidad nos indica que en muchas ocasiones nos encontraremos con bases de datos normalizadas de manera clásica. En este caso no podremos hacer “locuras” como tener toda la jerarquía en una tabla o hacer JOIN para armar un objeto, siempre desde el punto de vista de nuestro administrador SQL.

Intentando una mejor ingeniería de software, la solución correcta sería:

a) Mantener la normalización en la base de datos
b) Aprovechar la herencia en Java

Solución:

Podemos plantear el clásico ejemplo de Persona, Alumno y Docente.

La superclase Persona, abstracta y Alumno y Docente las clases concretas.
En la base de datos tendríamos las tablas Alumnos y Docentes respectivamente con campos ID autoincrementables independientes.

Aquí el Mapeo ORM (Uso de @MappedSuperclass):


@MappedSuperclass
public abstract class Persona {

@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String apellido;
private String nombre;

// SETTERS AND GETTERS

}

Clase concreta, en este lugar hacemos la referencia a la tabla normalizada.


@Entity
@Table(name = "Docentes")
public class Docente extends Persona implements Serializable {

private String mutual;

// GETTERS AND SETTERS

}

Muy simple y eficaz por cierto.

Anuncios