He estado usando Isolater (org.hibernate.engine.transaction.Isolater) de Hibernate 3.6 para poder trabajar fuera de una transacción.
Tengo que actualizar a Hibernate 4.3 o superior y Isolater ya no está en esta versión de hibernate. ¿Hay algún sustituto para realizar trabajo aislado después de este cambio en hibernación?
Hay un reemplazo en Hibernate 4 y 5, pero parece que no está diseñado para usarse fuera de los componentes internos de Hibernate.
Necesita acceso a un SessionImplementor , por lo que tendrá que enviar su sesión a eso. No puedo encontrar una manera de obtener acceso que no implique lanzar el resultado de getCurrentSession(). Luego puede usar TransactionCoordinator para crear un IsolationDelegate que funciona de manera similar a Isolater:
SessionImplementor session = (SessionImplementor) sessionFactory.getCurrentSession(); IsolationDelegate isolationDelegate = session.getTransactionCoordinator().createIsolationDelegate(); isolationDelegate.delegateWork(new AbstractWork() { @Override public void execute(Connection connection) throws SQLException { // This will run on a separate connection with the current // transaction suspended (if necessary) } }, false);Una cosa que puede hacer es usar la cola de acciones de Hibernate para registrar una devolución de llamada específica que se activa justo antes de la confirmación o inmediatamente después, según su caso de uso. Esas clases son:
org.hibernate.action.spi.BeforeTransactionCompletionProcess org.hibernate.action.spi.AfterTransactionCompletionProcess
Para su caso de uso, parece que le gustaría usar un AfterTransactionCompletionProcess . Para registrar la devolución de llamada con una sesión específica:
session.getActionQueue().registerProcess( new AfterTransactionCompletionProcess() { @Override void doAfterTransactionCompletion( boolean success, SharedSessionContractImplementor session) { // do your logic here } } );