Por que o CMT confirma na saída do método EJB, quando o atributo de transação é "Necessário"
Estudo constantemente constatando que minha transação já existente está sendo confirmada dentro de qualquer método de um EJB marcado como@ejb.transaction
type="Required"
. Isso pode estar correto?
Minha expectativa é que um EJB "exigindo" uma transação signifique: se já existe um, ele educadamente o deixará descomprometido quando feito, para que quem invocou begin () possa continuar a usá-lo para outras operações antes de invocarcommit()
ourollback()
. [Obviamente, se não houvesse transação em primeiro lugar, o método EJB chamariabegin()
ecommit()
/rollback()
.]
Minha expectativa está errada ou devo procurar um bug de configuraçã
Pode ser relevante acrescentar que estou usando o Hibernate 3 dentro do EJB. Estou obtendo uma UserTransaction antes de chamar o método EJB. O wrapper gerado pelo EJB chamaServerTransaction.commit()
na saída, na qual o Hibernate se conecta e aproveita a oportunidade para fechar sua sessão. O erro que estou recebendo é uma exceção de carregamento lento do Hibernate, porque a sessão é fechada quando tento acessar os getters em um objeto persistente do Hibernate. Então, tecnicamente, não tenho 100% de certeza se oServerTransaction.commit()
Observei necessariamente cometeu oUserTransaction
Comecei (talvezServerTransaction.commit()
nem sempre segue um commit "real"?), mas se não foi - então com que base o Hibernate está fechando a sessão?
Atualizar Creio que minhas suposições acima estavam corretas, mas minhas observações foram um pouco erradas. Veja abaixo minha resposta auto-fornecida.