Cuando trabajamos con Hibernate y JPA, uno de los primeros pasos fundamentales es registrar nuestras clases entidad en el archivo persistence.xml. Este archivo es el que le indica a JPA qué clases debe gestionar como entidades persistentes. Por ejemplo, si tenemos una clase Empleado dentro del paquete makigas.hibernate.model, debemos asegurarnos de incluirla explícitamente en el persistence.xml usando la etiqueta <class>. Si olvidamos este paso, Hibernate no podrá reconocer la entidad y nos dará errores difíciles de diagnosticar.
Una vez que tenemos nuestras entidades registradas, el siguiente reto es gestionar la persistencia de los datos. Para ello, utilizamos la interfaz EntityManager, que es el corazón de JPA para realizar operaciones CRUD (crear, leer, actualizar y eliminar). Esta interfaz nos ofrece métodos como persist para insertar nuevas entidades, merge para actualizar, remove para eliminar y find para buscar por clave primaria. Además, nos permite manejar transacciones y ejecutar consultas JPQL, que es un lenguaje similar a SQL pero orientado a entidades.
Para crear un EntityManager, necesitamos primero un EntityManagerFactory. En entornos JavaEE, esto se puede inyectar automáticamente con la anotación @PersistenceContext, pero cuando trabajamos fuera de un contenedor JavaEE, debemos crear el EntityManagerFactory manualmente usando la clase Persistence y su método createEntityManagerFactory, pasando el nombre de la unidad de persistencia definida en persistence.xml. Por ejemplo:
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistencia");
private static EntityManager em = emf.createEntityManager();
Con este EntityManager ya listo, podemos empezar a realizar operaciones sobre la base de datos. Para obtener todos los empleados, por ejemplo, podemos usar una consulta JPQL sencilla:
@SuppressWarnings("unchecked")
List<Empleado> empleados = em.createQuery("from Empleado").getResultList();
System.out.println("En esta base de datos hay " + empleados.size() + " empleados");
Es importante notar que en JPQL no es necesario escribir select explícitamente cuando queremos obtener todas las entidades de un tipo; la consulta "from Empleado" es suficiente. Sin embargo, al usar getResultList(), el resultado no está tipado, por lo que es común hacer un cast y suprimir las advertencias para evitar que el IDE nos moleste.
Cuando ejecutamos este código, Hibernate genera logs que pueden aparecer en rojo en la consola, pero no debemos preocuparnos: son mensajes informativos sobre la creación de tablas y la gestión interna de la sesión. Lo relevante es el resultado de nuestra consulta, que inicialmente mostrará cero empleados si aún no hemos insertado ninguno.
Este enfoque nos permite tener un control total sobre la gestión de la persistencia sin depender de un contenedor JavaEE, lo que es muy útil para aplicaciones Java SE o proyectos más sencillos. En próximos pasos, podemos ver cómo insertar entidades y realizar consultas más complejas con parámetros o named queries para optimizar nuestras operaciones.
Con estas bases, ya estamos en condiciones de manejar la persistencia de datos con Hibernate y JPA de forma clara y sencilla, entendiendo cómo configurar el entorno y cómo interactuar con la base de datos a través de EntityManager y JPQL.