Curso de Hibernate | Métodos de la clase Session 1

Curso de Hibernate
Métodos de la clase Session

Curso de Hibernate | Métodos de la clase Session 2

Transacciones

Cualquier código que modifique la base de datos (alta, baja y modificación) debería ir anidado en una transacción para surtir efecto.

Transaction tx = null;
try (Session session = sessionFactory.openSession()) {
    tx = session.beginTransaction();

    // Lógica de persistencia
    // session.save(objeto);

    tx.commit(); // Confirma si todo fue bien
} catch (Exception e) {
    if (tx != null) {
        tx.rollback(); // Revierte cambios si hubo error
    }
    e.printStackTrace();
}

Además en el ejemplo anterior hemos añadido un rollback, ya que hasta que no hagas commit() o rollback(), la transacción sigue activa y la base de datos puede estar bloqueando filas o recursos. Si simplemente cierras la sesión sin hacer rollback, la transacción se cerrará porque expire o porque el driver JDBC fuerce su cierre. Ninguna de las dos opciones es recomendable.

Algunos métodos de la clase session

session.save(persona) // guarda un objeto como registro en la base de datos.
session.refresh(persona) // en nos permitirá conocer la id del objeto insertado, suponiendo que la id sea autoincrementada.
session.update(persona);
session.saveOrUpdate(persona);
session.get(Persona.class, id) // me permite recuperar datos.
// el método load lo usamos sólo para borrar un paciente. ya que nos devuelve un paciente sólo con la clave primaria seteada. Para recuperar todos los valores usaremos get.
Persona personaABorrar = session.load(Persona.class, idPaciente);
session.delete(personaABorrar);

Insertar un Autor y un Libro

Cuando queremos salvar un objeto y sus relacionados ( un autor y sus libros en este caso), debemos salvar siempre el objeto del one to many.

Vamos a ver tres formas de hacerlo:

Añadir un libro existente a un autor existente

Esta sería la forma más sencilla, en la que añadimos un author al book.

Book book = session.get(Book.class, 1);
Author author = session.get(Author.class, 1);
session.update(book);

Añadir un nuevo libro a un nuevo autor

Author author = new Author();
author.setName("Juan");
session.save(author);
session.refresh(author);
Book book = new Book(author, "Como ser millionario");
session.save(book);

Salvando el autor en lugar de sus libros

Esta forma es un poco más elaborada. Aquí añadimos un libro al autor en lugar de un autor al libro.

Author author = session.get(Author.class, 3);
List<Book> books= autor.getBooks();
books.add( new Book(author, "Chipirones Gallegos"));
session.update(author);

session.flush()

Este método se asegura de que la información ha sido persistida en la base de datos, de forma que ya sea posible cerrar con seguridad la session.

Si haces un flush y un close, se persisten los cambios en la base de datos

Este método es ejecutado automáticamente por session.close(), no obstante es recomendable que siempre lo ejecutemos explícitamente justo antes.

Puede ser útil hacer un flush para recuperar la id autoincrementada de un objeto recien insertado. Ejemplo:

session.save(persona);
session.flush();
id = persona.getId();