Botón para abrir el Menú Botón para cerrar el Menú
Logo da empresa Alura
Iniciar Sesión Nuestros Planes
Formaciones Conoce a Luri
  • Programación _
  • Front End _
  • Data Science _
  • DevOps _
  • Innovación y Gestión _
Artículos de Tecnología > Programación

JPA con Hibernate: Herencia y Mapeos

Alura
Paulo Silveira
Paulo Silveira
01/07/2021

Compartir

Mira este artículo:
  1. Cuidado con la herencia por InheritanceType.JOINED
  2. Asignar resultados en lugar de trabajar con Lista<Object[]>

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.

Paulo Silveira
Paulo Silveira

Paulo Silveira é CEO e cofundador da Alura. Bacharel e mestre em Ciência da Computação pela USP, teve sua carreira de formação em PHP, Java e nas maratonas de programação. Criou o Guj.com.br, o podcast do Hipsters.tech e o Like a Boss.

Artículo Anterior
Cómo convertirse en desarrollador full-stack el próximo año
Siguiente Artículo
5 dudas de quien quiere iniciarse en la carrera de programación

Ver otros artículos sobre Programación

Navegación

  • Planes
  • Instructores
  • Blog
  • Política de privacidad
  • Términos de uso
  • Sobre nosotros
  • Preguntas frecuentes

¡CONTÁCTANOS!

  • ¡Quiero entrar en contacto!

Blog

  • Programación
  • Data Science
  • Front End
  • Innovación y Gestión
  • DevOps

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

NOVEDADES Y LANZAMIENTOS

Aliados

  • Programa de aceleração Scale-Up Endeavor
  • En Alura somos unas de las Scale-Ups seleccionadas por Endeavor, programa de aceleración de las empresas que más crecen en el país.
  • Growth Academy 2021 do Google For Startups
  • Fuimos unas de las 7 startups seleccionadas por Google For Startups en participar del programa Growth Academy en 2021
Alura

Powered by

Caelum

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

Cursos

Cursos de Programación
Lógica de Programación | Java
Cursos de Front End
HTML y CSS | JavaScript | React
Cursos de Data Science
Data Science | Machine Learning | Excel | Base de Datos | Data Visualization | Estadística
Cursos de DevOps
Docker | Linux
Cursos de Innovación y Gestión
Transformación Ágil | Marketing Analytics

Alura

  • Educação em Tecnologia

    • logo fiap FIAP
    • logo casa do codigo Casa do Código
    • logo pm3 PM3 - Cursos de Produto
  • Mais Alura

    • logo alura start START BY Alura
    • logo alura lingua Alura Língua
    • logo alura para empresas Alura Para Empresas
    • logo alura latam Alura LATAM
  • Comunidade

    • logo tech guide Tech Guide
    • logo 7 days of code 7 days of code
    • logo Hipsters ponto Jobs Hipsters ponto Jobs
  • Podcasts

    • logo Hipster Network Hipster Network
    • logo Hipsters ponto Tech Hipsters ponto Tech
    • logo Dev sem fronteiras Dev sem Fronteiras
    • logo Like a Boss Like a Boss
    • logo IA Sob Controle IA Sob Controle
    • logo Mesa de Produto Mesa de Produto
    • logo Decode Decode
    • logo FIAPCast FIAPCast