Vous avez probablement commencé une transaction et essayé d'en commencer une autre sans avoir validé ou annulé la précédente. L'idiome lors de l'utilisation de la démarcation programmatique des transactions est le suivant :
try {
sess.getTransaction().begin();
// do some work
sess.getTransaction().commit()
}
catch (RuntimeException e) {
sess.getTransaction().rollback();
throw e;
}
C'est fastidieux et sujet aux erreurs, et c'est l'une des raisons pour lesquelles l'utilisation d'EJB ou de Spring pour avoir des transactions déclaratives est si utile.