4.1 Transacciones e integridad de la base de datos

El modo normal de funcionamiento de una base de datos es cuando recibe miles de solicitudes cada minuto de cientos de clientes diferentes. En este caso, a menudo surgen situaciones en las que se accede a los mismos datos desde diferentes consultas.

Con menos frecuencia, pero, de nuevo, de vez en cuando hay situaciones en las que una solicitud lee una determinada línea y otra solicitud la cambia al mismo tiempo. ¿Imagínese lo que sucede si alguien lee una línea que solo ha cambiado la mitad? Nada bueno.

Este problema se resuelve de varias maneras. Primero, puede simplemente bloquear la línea que cambia. Tanto para leer como para escribir. Este método funciona, pero la velocidad de la base sufre mucho.

La segunda forma es bloquear la cadena solo para escritura. Sin embargo, seguirá habiendo un problema cuando alguien intente leer la línea parcialmente modificada. Conclusión: no debería haber una situación en la que la línea se cambie parcialmente.

Por lo tanto, se les ocurrió un tercer método: transacciones. Una transacción es un grupo de acciones que se realizan todas juntas o ninguna. No puede haber una situación en la que parte de las acciones se hayan realizado y la segunda parte no. Si no es posible realizar todos los cambios, se revierten todos los cambios ya realizados.

Cualquier servidor SQL moderno le permite cambiar datos solo en transacciones. Abre una transacción, realiza cambios en cualquier cantidad de tablas y confirma la transacción. Luego, SQL Server intenta realizar cambios. Si todo está bien, se agregarán a la base de datos general. Si hubo problemas, todos los cambios serán cancelados.

Hibernate también usa este paradigma. Es por eso que en la lección anterior vimos que al intentar guardar el objeto Empleado en la base de datos, primero se abría una transacción y, después de guardar, se confirmaba.

Entraremos en este tema con más detalle, pero por ahora, solo sepa por qué se necesitan transacciones y dónde se usan generalmente.

4.2 Obtener objetos

Si Hibernate ejecuta una solicitud para obtener datos, entonces no hay necesidad de abrir una transacción explícitamente. Hibernate mismo hará esto si lo considera conveniente: tiene su configuración, así como la configuración del servidor SQL.

Analizaremos cómo trabajar con la base de datos. Y la más sencilla de ellas es obtener un objeto por su ID . Para hacer esto, use el método get()en el objeto de sesión . La forma general de tal solicitud:

Class Name = session.get(Class.class, ID);

Ejemplo:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 Guardar (añadir) objetos

Si desea guardar su objeto en la base de datos, se ejecutará una consulta en el nivel de SQLINSERTAR. Por lo tanto, sus acciones deben realizarse como una transacción separada. Además, es mejor usar el método persist()del objeto de sesión para la persistencia .

La forma general de tal solicitud:

session.persist(An object);

El método persist()cambia no solo la base, sino también el objeto mismo. El caso es que cuando agregamos un objeto a la base de datos, este objeto aún no tiene su propia ID antes de agregarlo . Pues suele ser así, aunque hay matices. Y después de agregar el objeto ya tiene una identificación .

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

El objeto Session también tiene un método save()que realiza una función similar. Es solo que el método save()es el antiguo estándar de Hibernate y el método persist()es el estándar JPA.

4.4 Eliminación de objetos

Si desea eliminar un objeto existente, es muy fácil hacerlo. Para hacer esto, el objeto de sesión tiene un método especial: remove().

La forma general de tal solicitud:

session.remove(An object);

Y, por supuesto, escribamos el código con un ejemplo:

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

¿Por qué es tan difícil, te preguntarás?

Bueno, antes que nada, cualquier cambio en la base de datos siempre tiene consecuencias diferentes y no siempre obvias. Y en segundo lugar, este objeto podría tener objetos secundarios asociados, etc. Por lo tanto, los escenarios de eliminación a menudo no son triviales.