Per eseguire una corretta gestione dell’eccezione occorre approfondire il ciclo di vita della transazione a DB all’interno della sessione Hibernate, Infatti, sebbene le “azioni Hibernate” (persist, remove, ecc.) prevedano aggiornamenti ai dati nel DB, in realtà Hibernate esegue le istruzioni SQL solo in seguito ad una delle seguenti azioni:
1) Quando la transazione a DB è eseguita (commit).
2) Quando l’EntityManager Hibernate esegue lo scarico (flush) delle azioni.
Se le transazioni sono di tipo CMT (Container-Managed Transactions, ovvero è l’EJB Container a definire i confini della transazione) il caso 1, precedentemente descritto, avviene all’uscita dall’EJBContainer e non è gestito applicativamente. Questo significa che, senza “forzare” la flush dell’EntityManager, non è possibile gestire all’interno dei metodi di EJB le eccezioni sollevate dal DB.