Probablemente haya iniciado una transacción e intente iniciar otra sin haber confirmado o revertido la anterior. El idioma cuando se utiliza la demarcación de transacciones programáticas es el siguiente:
try {
sess.getTransaction().begin();
// do some work
sess.getTransaction().commit()
}
catch (RuntimeException e) {
sess.getTransaction().rollback();
throw e;
}
Esto es engorroso y propenso a errores, y esta es una de las razones por las que es tan útil usar EJB o Spring para tener transacciones declarativas.