Injeção de Dependência e UserTransaction

Boa tarde galera,

como eu posso, mesmo usando injeção de dependência para obter os ejbs, controlar a transação manualmente, abrindo e fechando quando eu bem entendo, ao invés de ela ser automática?
Seria usando o UserTransaction, mas minha dúvida é: como fazer o servidor de aplicação entender que não é para iniciar e terminar as transações automaticamente.
Posso chamar a UserTransaction diretamente de ManagedBeans, no caso de aplicações com JSF?

Desde já agradeço!

Se tiver no container vc não pode.

Na Java Magazine há um artigo, que teve sequência em quatro edições, onde esse controle era feito através de classes auxiliares, que obtinham os ejbs para passar para os managedBeans, através de lookUp, e também controlavam as transações, obtendo um UserTransaction.
Então quando era necessário iniciar ou terminar uma transação, eram chamados métodos nessa classe auxiliar.
O problema é que gostaria de saber se é possível fazer isso sem essas classes auxiliares, obtendo os EJBs por anotação e, mesmo assim controlando as transações como bem entendo, mesmo que eu tenha que criar uma classe auxiliar só pra isso.

Agradeço a atenção!

Deixe explicar melhor… estou disposto, se necessário, a criar uma classe auxiliar para controlar transações (UserTransactions) mas não queria perder a flexibilidade de obter os EJBs por anotação.

:wink:

Só dá com as “classes auxiliares” mesmo.

[quote=Luiz_Gustavo]Deixe explicar melhor… estou disposto, se necessário, a criar uma classe auxiliar para controlar transações (UserTransactions) mas não queria perder a flexibilidade de obter os EJBs por anotação.

:wink: [/quote]

Não sei se entendi direito, mas anotando o seu bean com:

@TransactionManagement(TransactionManagementType.BEAN)

a responsabilidade de controlar a transação passa a ser sua, e dai vc pode usar o UserTransaction para cotnrolar as suas transações.

Mas vale lembrar que o recomendado é deixar o container controlar as transações pra vc…

[quote=lavh][quote=Luiz_Gustavo]Deixe explicar melhor… estou disposto, se necessário, a criar uma classe auxiliar para controlar transações (UserTransactions) mas não queria perder a flexibilidade de obter os EJBs por anotação.

:wink: [/quote]

Não sei se entendi direito, mas anotando o seu bean com:

@TransactionManagement(TransactionManagementType.BEAN)

a responsabilidade de controlar a transação passa a ser sua, e dai vc pode usar o UserTransaction para cotnrolar as suas transações.

Mas vale lembrar que o recomendado é deixar o container controlar as transações pra vc…[/quote]

HUmmmmm… acho que o caminho do que eu preciso é esse aí (pelo menos o que eu consigo ver até agora).
Estou usando EJB há pouco tempo, por isso ainda não consegui definir a melhor estratégia.
É que queremos controlar o início e o término das transações no managedBean, pois uma operação pode envolver vários EJBs, e não queremos cada um deles com uma transação isolada.

Vi neste link (http://java.sys-con.com/read/325149.htm) que essa anotação que você citou é possível, mas ainda não li toda a matéria pra saber se funcionaria como estou pensando: anotar o Beans dessa maneira, e controlar a transação diretamente, abrindo e fechando no managedBean.

Uma opção seria criar EJBs de acordo com os casos de uso, com cada ums abendo quando começar e terminar uma transação.

De qualquer maneira, obrigado pela informação. Vou ler mais a respeito.

Abraços!

[quote=Luiz_Gustavo][quote=lavh][quote=Luiz_Gustavo]Deixe explicar melhor… estou disposto, se necessário, a criar uma classe auxiliar para controlar transações (UserTransactions) mas não queria perder a flexibilidade de obter os EJBs por anotação.

:wink: [/quote]

Não sei se entendi direito, mas anotando o seu bean com:

@TransactionManagement(TransactionManagementType.BEAN)

a responsabilidade de controlar a transação passa a ser sua, e dai vc pode usar o UserTransaction para cotnrolar as suas transações.

Mas vale lembrar que o recomendado é deixar o container controlar as transações pra vc…[/quote]

HUmmmmm… acho que o caminho do que eu preciso é esse aí (pelo menos o que eu consigo ver até agora).
Estou usando EJB há pouco tempo, por isso ainda não consegui definir a melhor estratégia.
É que queremos controlar o início e o término das transações no managedBean, pois uma operação pode envolver vários EJBs, e não queremos cada um deles com uma transação isolada.

Vi neste link (http://java.sys-con.com/read/325149.htm) que essa anotação que você citou é possível, mas ainda não li toda a matéria pra saber se funcionaria como estou pensando: anotar o Beans dessa maneira, e controlar a transação diretamente, abrindo e fechando no managedBean.

Uma opção seria criar EJBs de acordo com os casos de uso, com cada ums abendo quando começar e terminar uma transação.

De qualquer maneira, obrigado pela informação. Vou ler mais a respeito.

Abraços![/quote]

Se você anotar seus métodos com:

@TransactionAttribute(REQUIRED)

não será criada uma transação para cada EJB, e sim todos os EJBs vão usar a mesma transação. O REQUIRED apenas cria uma nova transação se não existir nenhuma.

Quem cria uma nova transação a cada chamada é o REQUIRES_NEW.

Mas como não conheço sua aplicação e tbm não conheço JSF não sei dizer se apenas isso seria suficiente pra resolver o seu problema ou se realmente controlar transações manualmente é o melhor caminho.

[]'s