Artículos de Tecnología > Programación

JPA con Hibernate: Herencia y Mapeos

Paulo Silveira

Estas semanas publicaré algunos datos rápidos sobre el uso de JPA con Hibernate. Estos son algunos puntos que siempre aparecen en el desarrollo, referentes a desempeño, elegancia y facilidades. Algunos temas ya son bien conocidos por los usuarios de Hibernate, pero en JPA, algunos de ellos se usan de manera diferente.

Cuidado con la herencia por InheritanceType.JOINED

Aquí en Alura usamos la herencia con mucho cuidado. Herencia en JPA se mapea con @Inheritance (strategy=InheritanceType.SINGLE_TABLE) por estándar, es decir, utilizará una única tabla para guardar todos los datos de todas las clases hijas: no hay normalización y una columna (el discriminator, por defecto DTYPE en Hibernate), se utilizará para distinguir entre posibles subclases.

Muchos administradores de bases de datos se quejan de esta estrategia, la más elegante de las cuales es InheritanceType.JOINED, donde cada clase tendrá una tabla, pero sin columnas repetidas. Las tablas que representan las clases hijas tienen una clave extranjera para la tabla que representa a la madre, normalizando la banco al respecto.

El gran problema con esta estrategia son las queries polimórficas: en caso de que tengas una clase madre Persona y dos hijas Personafísica y PersonaJurídica, al buscar una Persona por su clave primaria, hibernación generará un join entre todas estas tablas (puede variar ligeramente según el dialecto utilizado), ya que no tenemos el discriminator en ese caso.

Asignar resultados en lugar de trabajar con Lista<Object[]>

Si ejecutamos una Query en la que nuestro select no elija solo un tipo de valor a devolver, recibimos un List<Object[]> como resultado. Por ejemplo, un select e1.attributoEntero, e2.attributoString from Entidad1 as e1, Entidad2 as e2 donde ...devolvería una List<Object[]> donde, para cada elemento de la lista, la primera posición de la array es un Tnteger referente al atributoEntero de la Entidad1 y la segunda posición es una String referente al atributoString de la Entidad2.

Tanto JPA como Hibernate le permiten devolver cualquier tipo de objeto a través de la cláusula de select, usando un constructor. Podemos cambiar la query anterior a select new com.aluracursos.Bean (e1.atributoEnterO, e2.atributoString) de Entidad1 as e1, Entidad2 as e2 donde ...para recibir un List como resultado, siempre que la classe com.aluracursos.AlgumBean tenga un constructor que reciba un Integer y una String. Mucho más elegante que tener que recurrer a una List<Object[]> y llenar nuestro código de castings. Excelente para generar informes y devolver datos organizados en beans específicos.

Para mapeos más avanzados, Hibernate tiene la interfaz ResultTransformer y su factory Transformers. JPA define la SQLResultSetMapping y otras anotaciones, pero para el uso de native queries.

Artículos de Tecnología > Programación

En Alura encontrarás variados cursos sobre Programación. ¡Comienza ahora!

Precios en:
USD
  • USD
  • BOB
  • CLP
  • COP
  • USD
  • PEN
  • MXN
  • UYU

Semestral

  • 273 cursos

    Cursos de Programación, Front End, Data Science, Innovación y Gestión.

  • Videos y actividades 100% en Español
  • Certificado de participación
  • Estudia las 24 horas, los 7 días de la semana
  • Foro y comunidad exclusiva para resolver tus dudas
  • Luri, la inteligencia artificial de Alura

    Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana

  • Acceso a todo el contenido de la plataforma por 6 meses
US$ 65.90
un solo pago de US$ 65.90
¡QUIERO EMPEZAR A ESTUDIAR!

Paga en moneda local en los siguientes países

Anual

  • 273 cursos

    Cursos de Programación, Front End, Data Science, Innovación y Gestión.

  • Videos y actividades 100% en Español
  • Certificado de participación
  • Estudia las 24 horas, los 7 días de la semana
  • Foro y comunidad exclusiva para resolver tus dudas
  • Luri, la inteligencia artificial de Alura

    Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana

  • Acceso a todo el contenido de la plataforma por 12 meses
US$ 99.90
un solo pago de US$ 99.90
¡QUIERO EMPEZAR A ESTUDIAR!

Paga en moneda local en los siguientes países

Acceso a todos
los cursos

Estudia las 24 horas,
dónde y cuándo quieras

Nuevos cursos
cada semana