Pregunta

Actualmente estoy desarrollando una aplicación en java utilizando Hibernate como administrador de persistencia y JPA como una abstracción de la gestión de persistencia de hibernación.

Me gustaría saber el impacto de envolver una consulta de resultados alrededor de una transacción. Sé que el administrador de la entidad debe permanecer abierto para los errores de campo que se obtienen de forma perezosa. ¿Qué pasa con la transacción en todo esto?

Aquí hay un ejemplo de código con capacidad de activación / desactivación de transacciones.

public List<Exportdata> get(Integer max, EntityManager em, Boolean withTransaction) {
    EntityTransaction tx = null;
    try {
        if (withTransaction) {
            tx = em.getTransaction();
            tx.begin();
        }

        Query query = em.createQuery("from Exportdata");
        query.setMaxResults(10);
        List<Exportdata> list = query.getResultList();

        if (withTransaction)
            tx.commit();

        return list;
    } catch (RuntimeException re) {
        if (withTransaction)
            if (tx != null && tx.isActive())
                tx.rollback();

        throw re;
    }
}

¿Cuál es la diferencia entre habilitar o deshabilitar withTransaction cuando se llama a esta función?

Gracias a todos, Fred

¿Fue útil?

Solución

No hay diferencias prácticas aquí, ya que no está cambiando ningún dato. La consulta que ejecute generará una selección SQL. Las transacciones están ahí para permitirle aplicar las propiedades ACID a una colección de inserciones, actualizaciones, etc.

Sin embargo , si comienza a manipular los objetos de la lista devueltos por este método, llamando a los establecedores, etc. esos cambios se propagarán a la base de datos con una transacción en un ad-hoc base. En otras palabras, estarás trabajando efectivamente con la base de datos en el modo de confirmación automática. Es poco probable que esto sea lo que quieres.

Lo importante a comprender es que la duración de un contexto de persistencia y una transacción se pueden administrar por separado. A menudo, aunque desearía gestionarlos juntos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top