hibernate session grails transactions gorm

hibernate - ¿Cuál es la diferencia entre withTransaction y withSession en griales?



grails transactions (2)

Session y TransactionStatus son dos cosas completamente diferentes. La sesión es una abstracción que le da acceso a toda la funcionalidad de hibernación mientras que TransactionStatus se puede usar para controlar la transacción actual.

withSession se puede usar si necesita acceso directo a funciones de hibernación. Esto puede ser útil si desea utilizar una función de hibernación que no es compatible directamente con Grails / GORM.

Sé que uno recibe la sesión subyacente y el otro una referencia al estado actual de la transacción; sin embargo, ¿cuáles son las diferencias entre ellos y lo que sería un ejemplo de caso de uso para cada uno?

Mi requisito es guardar por lotes algunos registros dentro de un bloque de método de servicio.


withTransaction es un poco hackish porque te permite hacer trabajo transaccional en cualquier lugar, pero es mejor separar tus preocupaciones y hacer el trabajo en un servicio transaccional. Un servicio es transaccional por defecto a menos que agregue static transactional = false y se pueda ajustar en el nivel de clase y / o método con la anotación @Transactional . Debería estar bien solo poniendo su código en un método de servicio sin usar withTransaction o withSession .

withSession es una forma conveniente de acceder a la Session Hibernate actual (por lo general, la registrada por el interceptor OpenSessionInView). Si desea borrar la sesión, o hacer otro trabajo que no esté expuesto por GORM, esta es una forma de acceder sin tener acceso a sessionFactory o a los titulares locales de subprocesos que utiliza Spring.

Un uso algo válido de withTransaction fuera de un método de servicio transaccional es vincular una Session Hibernate cuando está fuera de una solicitud de controlador (es decir, cuando no hay Session creada automáticamente). withTransaction iniciará una transacción y creará una Session si es necesario, y la mantendrá abierta mientras dure el cierre. Entonces puede usarlo para evitar excepciones de carga diferida. Necesitamos otra forma de hacerlo sin la sobrecarga de una transacción, para aquellos casos en los que solo está leyendo desde la base de datos y no necesita escrituras transaccionales. Pero por ahora, este enfoque funciona. Sin embargo, si escribe en la base de datos, mueva el código a un método de servicio.