es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hibernate 5 Eliminando Entidades por su Id no Funciona de Forma Confiable.

Actualmente estoy trabajando en la operación de eliminación de una API REST creada con Jersey 3.0.3. Utilizo Hibernate 5.6.2 y soy nuevo en Hibernate, pero después de investigar un poco y realizar pruebas, me he quedado con el siguiente código y tengo el siguiente problema: al intentar eliminar un objeto por su id (el objeto solo contiene valores de tipo String, int, long y enum como atributos), la eliminación se ejecuta sin errores, pero no funciona de manera fiable. Por lo general, al intentar eliminar un objeto recién agregado, la eliminación debe ejecutarse exactamente dos veces para que funcione. En todos los demás casos, la eliminación funciona bien.

He probado diferentes métodos para eliminar el objeto (como session.remove(obj), session.delete(obj) y también probé eliminar usando una consulta), pero cada enfoque conduce al mismo comportamiento inesperado.

¿Qué estoy haciendo mal?

Código para guardar el objeto CustomObject obj:

Session session = sessionFactory.openSession();
session.beginTransaction();
Serializable s = session.save(obj);
session.getTransaction().commit();
session.close();

Código para eliminar el objeto CustomObject obj por su id:

Session session = sessionFactory.openSession();
session.beginTransaction();
CustomObject obj = session.get(CustomObject.class, id);
session.getTransaction().commit();

session.beginTransaction();
if (obj != null) {
     session.delete(obj);
}
session.getTransaction().commit();
session.close();
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la operación de eliminación puede radicar en el hecho de que la sesión se cierra después de la transacción inicial en la operación de guardado. Cuando la sesión se cierra, los objetos adjuntos se convierten en objetos desvinculados y no se pueden eliminar hasta que se vuelvan a adjuntar a una nueva sesión.
    Para solucionar esto, intente modificar el código para guardar el objeto Personalizado manteniendo la sesión abierta hasta después de la operación de eliminación. Además, asegúrese de que el id que se pasa a la operación de eliminación sea correcto y coincida con el id del objeto que se va a eliminar.

    Código actualizado para guardar el objeto Personalizado obj:

    Session session = sessionFactory.openSession();
    session.beginTransaction();
    Serializable s = session.save(obj);
    session.getTransaction().commit();
    // Mantenga la sesión abierta
    

    Código para eliminar el objeto Personalizado obj por id:

    Session session = sessionFactory.openSession();
    session.beginTransaction();
    CustomObject obj = session.get(CustomObject.class, id);
    session.getTransaction().commit();
    // Mantenga la sesión abierta
    
    session.beginTransaction();
    if (obj != null) {
        session.delete(obj);
    }
    session.getTransaction().commit();
    session.close();
    

    Alternativamente, también puede intentar usar el EntityManager proporcionado por Hibernate en lugar de la Session, ya que puede ofrecer un mejor soporte para las APIs REST de Jersey.

Comments are closed.