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.
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.
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 Listcom.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.
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
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
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
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
Paga en moneda local en los siguientes países
Puedes realizar el pago de tus planes en moneda local en los siguientes países:
País | |||||||
---|---|---|---|---|---|---|---|
Plan Semestral |
486.67
BOB |
68394.52
CLP |
305581.03
COP |
65.90
USD |
264.64
PEN |
1434.55
MXN |
2971.58
UYU |
Plan Anual |
737.76
BOB |
103681.53
CLP |
463240.44
COP |
99.90
USD |
401.17
PEN |
2174.68
MXN |
4504.73
UYU |
Acceso a todos
los cursos
Estudia las 24 horas,
dónde y cuándo quieras
Nuevos cursos
cada semana