Você provavelmente iniciou uma transação e está tentando iniciar outra sem ter confirmado ou revertido a anterior. O idioma ao usar a demarcação de transação programática é o seguinte:
try {
sess.getTransaction().begin();
// do some work
sess.getTransaction().commit()
}
catch (RuntimeException e) {
sess.getTransaction().rollback();
throw e;
}
Isso é complicado e propenso a erros, e essa é uma das razões pelas quais usar EJBs ou Spring para ter transações declarativas é tão útil.