Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar o Hibernate Session.doWork(...) para savepoints/transações aninhadas?


A java.sql.SQLException: IJ031040 parece relacionado a um resultado específico durante nossa importação. Mais tarde, foi substituído por outro java.sql.SQLException que proíbem a reversão de transações gerenciadas. Mas finalmente consegui resolver o problema emitindo instruções SQL nativas:
// Mark the current state as SAVEPOINT...
Session session = this.em.unwrap(Session.class);
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.prepareStatement("SAVEPOINT TRY_POSSIBILITY").executeUpdate();
    }
});

// 
// Do all the risky changes... verify... decide...
// 

// Rollback to SAVEPOINT if necessary!
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.prepareStatement("ROLLBACK TO SAVEPOINT TRY_POSSIBILITY").executeUpdate();
    }
});

Isso permite uma "transação aninhada" dentro da maior e resolveu meus problemas.