Hibernate

Hibernate es una herramienta de mapeo objeto-relacional (ORM) para la plataforma Java (y disponible también para .Net con el nombre de NHibernate) que facilita el mapeo de atributos entre una base de datos relacional tradicional y el modelo de objetos de una aplicación, mediante archivos declarativos (XML) o anotaciones en los beans de las entidades que permiten establecer estas relaciones. (Definición de wikipedia)

Tipos Valor y tipos Entidad (Value and Entity types)

Un Entity Type es una clase java que contiene una colección de datos. Estas entidades serán las tablas de nuestra base de datos. Mientras que los Value Types son las columnas de nuestras tablas, son primitivos como int, boolean o char. Pero también clases que representan una sola pieza de información como LocalDate o BigInteger.

Ejemplo de una definición con sus anotaciones. Utilizamos las anotaciones @Table y @Column para cambiar los nombres por defecto.

Tipos básicos (Basic Types)

Hibernate proporciona una lista de tipos básicos que mapea con los tipos de java. Ejemplos:
Hibernate selecciona automáticamente los BasicTypes por defecto, pero se pueden especificar con la anotación @Type, como se muestra en este ejemplo:
La anotación para identificar el identificar es @Id y la forma de crear el clásico autoincrementador @GeneratedValue.

Relaciones entre tablas o entidades

Existen tres formas de asociar datos: mediante Value Types, mediante Embeddables y la que para mi tiene mayor sentido, mediante Entities.

Los tipos de asociaciones que tenemos mediante Entities son:
  • OneToOne: Una entidad en cada lado.
  • OneToMany y ManyToOne: Lista de entidades en un lado y una sola entidad en el otro.
  • ManyToMany: Listas de entidades en ambos lados.
En el ejemplo anterior la asociación es bidireccional, pero podría ser direccional eliminando una de las referencias de las entidades.

Las asociaciones pueden resolverse con una columna extra (@JoinColumn) en una de las entidades, pero en el caso de las relaciones ManyToMany, una pivot table o Join Table es necesaria (@JoinTable).

Single Table Inheritance

Es una forma de emular la herencia orientada a objetos en una base de datos relacional. Al mapear desde una tabla de base de datos a un objeto en un lenguaje orientado a objetos, un campo en la base de datos identifica a qué clase en la jerarquía pertenece el objeto. En este ejemplo el campo "tipo" incluira el discriminador.
Ademas de la estrategia InheritanceType.SINGLE_TABLE del ejemplo anterior, tenemos las estrategias InheritanceType.JOINED, y InheritanceType.TABLE_PER_CLASS, las cuales a diferencia de la SINGLE_TABLE, crean tablas adicionales.
  • JOINED: crea una tabla para la clase padre y otra para cada subclase. Las tablas de las subclases solo contendrán campos únicos a su clase, no del padre.
  • TABLE_PER_CLASS: como en la anterior, crea una tabla para la clase padre y otra para cada subclase, pero esta vez las subclases contienen todos los campos del padre y sus propias.
Otro ejemplo:

Paso de información desde el controlador

Quizá no estemos interesados en proporcionar toda la información de nuestras Entities a traves de nuestros controladores, para ello tenemos dos maneras de convertir nuestros datos: Data Transfer Objects (DTOs), que suelen tener el nombre de la entidad con el sufijo DTO.
La segunda manera es a través de los JSONView. Java proporciona la serialización de vistas, lo que nos permite generar sólo un conjunto de datos de un objeto y convertirlo en otro objeto como XML o JSON. Esto requiere tres pasos:
  1. Crear un interface con los atributos que queremos proporcionar.
  2. Marcar con la anotación @JSONView los atributos que queremos asociar a esa interface.
  3. Especificar en el controlador que solo vamos a proporcionar los atributos del interfaz.
No es un método muy útil cuando es necesario combinar datos de varias entidades, y puede necesitar actualizaciones en un entidad si el frontend necesita un cambio. Aunque es una opción sencilla si estamos modo full stack, y resulta muy visible que partes de las entidades serán proporcionadas al consumidor.

Comentarios

Entradas populares de este blog

Django REST framework

Envío de checkboxes o selector multiple por AJAX con jQuery

Django: relaciones polimórficas