/ / La stored procedure richiamata tramite hibernate non commette modifiche nel database - spring, hibernate, session

La procedura memorizzata chiamata tramite hibernate non commette modifiche nel database - spring, hibernate, session

Stiamo sviluppando un'applicazione con Spring e Hibernate. La classe del livello dao è la seguente:

@Autowired
private StoredDao storedDao;

@PersistenceUnit
private EntityManagerFactory emf;

public boolean method() throws Exception {

EntityManager em;
Session session;
Transaction tx;

try{

em = emf.createEntityManager();
session = em.unwrap(Session.class);
tx = session.beginTransaction();
...
...
...
storedDao.processBills(billId, billStatus, billApprover);
...
...
tx.commit();
} catch(Exception e){
tx.rollback();
}

}

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
@Override
public void processBills(int billId, int billStatus, String billApprover, Session session){

try{

final Work processBillCaller = buildStoredProcCaller(billId, billStatus, billApprover);

session.doWork(processBillCaller);
} catch (Exception e){

throw new Exception("message");

}

}

private Work buildStoredProcCaller(int billId, int billStatus, String billApprover) {



return new Work() {
@Override
public void execute(Connection con) throws SQLException {


try (CallableStatement callableStmt = con.prepareCall(<procName>);) {

callableStmt.setInt(1, billId);
callableStmt.setString(2, billStatus);
callableStmt.setInt(3, billApprover);


callableStmt.executeUpdate();
} catch (Exception e) {

throw new SQLException("message");
}

}
};

}

Tutte le query che sono in method () vengono eseguite. Anche la stored procedure viene eseguita nel metodo processBills. Nei log, il messaggio è il seguente:

[ABC1] [DEBUG] [org.hibernate.SQL] {chiama procName?,?,? }

Ma i risultati della stored procedure non vengono commessi.

Ci sono molti session.save () e session.unione () chiamata prima e dopo la chiamata alla procedura memorizzata. Quando viene eseguito tx.commit (), viene eseguito tutto, tranne i risultati della stored procedure. Nessun errore sta arrivando.

Ho anche provato a commentare @Transactional e quindi a eseguire il flusso di codice sopra. Ma ancora, il codice di procedura memorizzato non viene attivato.

Per favore fatemi sapere cosa sto facendo male.

risposte:

0 per risposta № 1

Ciao ho trovato la risposta a questo. Prima di chiamare la procedura memorizzata, la nuova fattura non è ancora persistente nel database. Viene mantenuto solo quando viene chiamato transaction.commit (). Quindi, quando la stored procedure era in esecuzione, la fattura da elaborare non era nel database.

Quindi ora prima della chiamata alla procedura memorizzata, ora chiamo session.flush () e quindi viene eseguita la stored procedure. Funziona.