Dúvida Managed Bean

5 respostas
G

Bom dia galera, estou com a seguinte dúvida ao usar um bean gerenciado pelo servidor Glassfish 3.1, se eu tenho um bean como abaixo:

@ManagedBean(name="meuBean")
@ViewScoped
public class MeuBean implements Serializable {

	@PersistenceContext
	private EntityManager entityManager;
	private MinhaEntidade minhaEntidade;
	
	public MeuBean() {
		
	}
	
	public void inserir() {
		entityManager.persist(minhaEntidade);
	}
	
	//getters e setters
	
}

Quando eu chamo o método inserir() na minha view a seguinte exceção é lançada:

javax.persistence.TransactionRequiredException

no meu persistence.xml está configurado para usar JTA, estou usando o eclipselink, mas se eu adicionar a anotação @Stateless nesse mesmo bean sem fazer mais nenhuma alteração a entidade é persistida normalmente para o banco de dados, a dúvida é: Eu sou obrigado a anotar meu bean com @Stateless para que o servidor controle a transação com a JTA?

Obrigado.

5 Respostas

F

evite fazer isso PersistenceContext nos ManagedBean, sugiro criar uma estrutura em camadas, MVC por exemplo, e esta injeção de dependência vc coloca na camada de acesso aos dados. existem vários exemplo na net sobre isso, procura por exemplo jsf mvc com ejb, algo assim…

Flavio_Almeida

Um JSF managed bean não é transacional. Você pode resolver isso de várias formas:

a) Abrir e fechar a transação manualmente;

b) Acessar um EJB com @TransactionalAtributte no método que insere dentro do seu managed Bean JSF (soução pré-CDI);

c) Não usar JSF managed beans, mas um CDI bean, daí, você poderá usar um EJB diretamente na view, mas precisará de <a class="mention" href="/u/named">@Named</a>;

d) usar um CDI bean, mas sem usar um EJB, escrevendo você mesmo o seu interceptador de transação.

obs: não há ViewScope em CDI: ou você desenvolve ou usa a implementação de terceiros.

A a maneira mais rápida de resolver seu problema é com @Named, mas você não terá ViewScope “out-of-the-box”.

Eu recomendo a opção d).

Há um tutorial desatualizado sobre controle de transação usando apenas CDI que eu postei aqui no GUJ:

http://www.guj.com.br/java/234900-cdi–jsf-20-e-injecao-do-entitymanager-com-transacao-demarcada-mini-howto#1209265

Abraçamos CDI aqui na empresa desde a sua concepção.

Abraço

G

Olá fdcrli, então eu estou usando sim uma estrutura em camadas, não faço a injeção do EntityManager nos meus beans, coloquei dessa forma aqui por questões de simplificar o exemplo que quis dar, eu preciso mesmo anotar o bean com @Stateless para que a transação seja controlado pelo servidor?

F

concordo com o que o Flavio Almeida, relatou…

tem mais exemplos aqui…

http://quebrandoparadigmas.com/?p=585

G

Valeu Flavio Almeida vou dar uma olhada no tutorial e posto aqui qualquer coisa.
Obrigado.

Criado 29 de agosto de 2011
Ultima resposta 29 de ago. de 2011
Respostas 5
Participantes 3