Ejb 3 Stateful – Exemplo

Neste tutorial será mostrado o exemplo de uma aplicação EJB 3 no padrão JEE 5, do tipo Stateful, utilizando JPA, Hibernate, banco de dados Mysql e servidor de aplicações Jboss.

Existem 2 tipos de Ejb Stateless e Stateful, a diferença entre eles é que no Stateless ele guarda o estado dos objetos na sessão, e no Stateful ele guarda o estado dos objetos no container.
Mostrarei a utilização de um Session Bean do tipo Stateful. Neste projeto do exemplo será utilizado o Design Pattern MVC.

Eclipse

Mostrarei detalhadamente as subdivisões da camada Model, deste padrão MVC, como mostrado acima no diagrama.
Estarei mostrando um tipo de transação de Ejb gerenciada pelo Bean.
Na camada Model, o projeto tem um módulo chamado Facade que possui a camada de negócio, e um módulo chamado model, que possui a camada de persistência.

Eclipse

Na pasta META-INF fica o arquivo persistence.xml, como todo projeto jpa.

Eclipse

Na camada model, ela possui os objetos que fazem referência ao banco de dados.
Vou pegar de exemplo o objeto Empresa, para se fazer referência a tabela empresa do banco de dados, utilizo o atributo @Table.

Eclipse

Nos objetos que fazem referência a Foreign Keys (Chaves Estrangeiras), é utilizado o objeto Collection, ao invés de List, para no caso da referência do cascade, quando se for fazer um eager, se ter uma facilidade maior e consequente produtividade.

Eclipse

Estarei mostrando agora o ejb chamado EmpresaBean, o projeto do exemplo é um sistema de gerenciamento de currículos.
Tem a declaração do ejb do tipo Stateful.

Eclipse

Tem a declaração das interfaces do ejb, @Remote e @Local.

Eclipse

Tem a declaração dos bindings do ejb, @RemoteBinding e @LocalBinding.

Eclipse

Tem a declaração do tipo de transação do ejb, @TransactionManagement. Que é do tipo BEAN.

Eclipse

Nesse exemplo, de Ejb do tipo Stateful, não é utilizado o controle de transações JTA pelo Container, foi utilizado o controle explícito de transações JTA por BMT (Bean Managed Transactions), ou seja as transações são gerenciadas pelo bean. Como o gerenciamento pelo Container, é muito bom e livre de problemas, somente em alguns casos é que é recomendado utilizar esse tipo de transação, pois qualquer erro na codificação, pode acabar em problemas no banco de dados.
A situação em que é utilizado esse tipo de transação, é de código legado.

Tem a declaração da injeção de dependência do PersistenceUnit.

Eclipse

Tem a declaração do objeto de transação que será utilizado no bean, o UserTransaction.

Eclipse

No método construtor do bean é feito o lookup de sessão de transação.

Eclipse

Os métodos utilizados nos beans deste projeto são os do padrão crud, inclusão, consulta, atualização e deleção.
Logo acima do método de inclusão, encontra-se comentado o tipo de atributo de transação, que geralmente é utilizado REQUIRED, quando o tipo de transação do bean é de container, como aqui é do bean, então a transação é controlada manualmente pelo o objeto UserTransaction.

Eclipse

No método de atualização a mesma coisa, a transação não é controlada pelo container, é controlada manualmente.

Eclipse

No método de consulta, não se utiliza transação, então quando a transação é controlada pelo container, é utilizado o tipo de atributo de NEVER, para indicar que não será utilizada nenhuma transação. Neste caso como a transação é controlada pelo bean, não é declarado nada.

Eclipse

No método de consulta utilizo jpql, e para fazer eager, utilizo o comando “fetch all properties” na query.
Ele carrega todas as propriedades dos objetos que fazem referência ao objeto empresa. E para inicializar a lista, carregar os objetos da coleção, se utiliza o comando “size”. Assim é carregada a lista de vagas dessa empresa. É mais simples fazer assim, é mais produtivo.

Eclipse
Eclipse

No método de exclusão a mesma coisa que no de atualização, a transação não é controlada pelo container, é controlada manualmente.

Eclipse

Vou mostrar outro exemplo de inicialização de listas, no session bean de Curriculo, no objeto CurriculoBean. Nesse objeto ele possui duas listas a serem inicializadas, de experiências e a de idiomas. E da mesma forma, como no session bean de Empresa, no método de consulta utilizo jpql, e para fazer eager, utilizo o comando “fetch all properties” na query.
Ele carrega todas as propriedades dos objetos que fazem referência ao objeto curriculo. E para inicializar a lista, carregar os objetos da coleção, se utiliza o comando “size”. Assim são carregadas as listas de experiencias e idiomas desse curriculo. É mais simples fazer assim, é mais produtivo.

Eclipse
Eclipse

Para se testar a aplicação, é só executar um teste integrado, com a classe TesteCrud, que se encontra no pacote de testes, junto do código-fonte da aplicação.

Eclipse
Eclipse
Eclipse

Abaixo segue o link com o código-fonte:
Baixar Código-Fonte via GitHub

Abaixo um vídeo com a explicação do exemplo.

Para ver o vídeo no YouTube Clique Aqui

Por favor, deixe seu like se gostar da dica.

Esta entrada foi publicada em Java EE. Adicione o link permanenteaos seus favoritos.

Os comentários estão encerrados.