VRaptor 3 + HibernateTransactionInterceptor

Bom dia,

Estou com algumas dúvidas referente ao Interceptor de abertura de transação do VRaptor…

O VRaptor possui um Interceptor com o método:

        public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			stack.next(method, instance);
			transaction.commit();
		} finally {
			if (transaction != null && transaction.isActive()) {
				transaction.rollback();
			}
		}
	}

1 - Esse interceptor impede que seja lancada uma LazyInitializaionException, caso eu possua por exemplo no meu jsp um {usuario.enderecoList}, sendo endereco list mapeado com Lazy?

2 - Caso eu precise abrir uma transação mais específica em um método de alguma classe de negócio minha, como posso fazer? já que o Interceptor abre uma geral.

3 -

finally {
     if (transaction != null && transaction.isActive()) {
          transaction.rollback();
     }
}

nao entendi este finally, nao deveria ocorrer rollback caso alguma exception fosse lancada? nao deveria ficar dentro de um bloco catch?

desde ja, obrigado

Não impede… se der qualquer exception ele não vai commitar a transação e vai dar um rollback… mas a exceção será lançada normalmente

se vc precisa de uma transação específica, vc não pode usar essa solução geral do vraptor…
mas pq vc precisaria disso? usar mais de uma transação no mesmo request?

o finally é executado sempre: dando exception ou não…
se não deu exception, o interceptor vai executar um transaction.commit(), e a transação não estará mais ativa… logo não será feito o rollback
se der qualquer exception, o transaction.commit() não será executado, e a transação ainda estará ativa, daí será feito o rollback…

saquei…

Uma entidade, por exemplo:

@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioId", fetch = FetchType.LAZY)
    private List<Agendamento> agendamentoList;
}

se no jsp eu chamar:

{usuario.agendamentoList}

neste caso, como a sessão estará aberta nao ocorre a LazyInitializaionException, certo?

valeu lucas, mais uma vez

ah tah… sim, ele previne o LazyInitializationException pq a session fica aberta até o final da requisição