Probabilmente hai iniziato una transazione e stai cercando di iniziarne un'altra senza aver eseguito il commit o il rollback della precedente. L'idioma quando si utilizza la demarcazione delle transazioni programmatica è il seguente:
try {
sess.getTransaction().begin();
// do some work
sess.getTransaction().commit()
}
catch (RuntimeException e) {
sess.getTransaction().rollback();
throw e;
}
Questo è ingombrante e soggetto a errori, e questo è uno dei motivi per cui l'uso di EJB o Spring per avere transazioni dichiarative è così utile.