Conceitos Essenciais de Java EE: Collections, JPA, MVC e EJB

Classificado em Computação

Escrito em em português com um tamanho de 46,9 KB

Collections

Imagen

Características das Collections

  • Interface SET: Coleção não ordenada que não contém duplicatas; a ordem de inserção dos elementos não é mantida.
  • Interface LIST: Coleção de classes ordenadas onde as duplicatas são permitidas; a ordem de inserção dos elementos é mantida.
  • Interface MAP: Os elementos são associados a uma chave; o acesso aos elementos é feito através da chave, em vez do próprio elemento; não há duplicidade de chaves.
  • Interface PROPERTIES: Coleção de propriedades do tipo CHAVE e VALOR, onde cada chave da propriedade tem seu valor único.

Principais Métodos da Interface Collections

  • void sort(List lista) - classifica em ordem acessível.
  • int binarySearch(List lista, Object chave) - retorna o índice da lista onde o elemento está (-1 se não for encontrado).
  • void shuffle(Collection coleção) - mistura os elementos.
  • void swap(Collection coleção, int pos1, int pos2) - troca posições.
  • void reverse(List lista) - inverte a ordem dos elementos.
  • iterator() - retorna um Iterator que permite percorrer a lista.
  • size() - retorna a quantidade de elementos da lista.
  • hasNext() - verifica se há um próximo elemento na lista para ser percorrido.
  • next() - retorna o elemento da lista.

JPA - Métodos da Interface EntityManager

  • persist(Object o): Persiste uma entidade, tornando-a gerenciada pelo Gerenciador de Entidades. Assim, qualquer alteração nela será refletida no banco de dados.
  • T merge(T entidade): Sincroniza os dados no banco de dados com os atributos da entidade. Retorna um objeto gerenciado (managed) e não pode ser utilizado em um objeto REMOVIDO.
  • void refresh(Object entidade): Sincroniza os atributos na entidade com os dados do banco de dados.
  • void remove(Object entidade): Remove a entidade do banco de dados (deleta o registro).
  • T find(Class<T> classeEntidade, Object chavePrimaria): Retorna uma entidade GERENCIADA através de sua chave primária ou null caso a chave não exista.
  • Query createQuery(String sql): Cria uma consulta dinâmica.
  • Query createNamedQuery(String nomeConsulta): Cria uma consulta nomeada.
  • void begin(): Inicia uma transação.
  • void commit(): Encerra uma transação, gravando quaisquer alterações no banco.
  • void rollback(): Desfaz quaisquer alterações efetuadas sobre a entidade desde o início da transação.
  • EntityTransaction getTransaction(): Retorna a transação do EntityManager.

Mapeamento Objeto-Relacional (ORM)

Mecanismo sofisticado para mapeamento de objetos Java em memória para tabelas do banco de dados. Permite persistir objetos em bancos de dados relacionais. Cada instância de um objeto corresponde a um registro no banco de dados. Especificado através do uso de anotações no código.

  • JPA é baseado no conceito POJO (Plain Old Java Object).
  • Exemplo de provedores JPA:
    • Hibernate
    • JDO
    • Oracle TopLink
    • KODO

Entidade (Entity)

É o objeto que pode ser gravado pelo mecanismo de persistência. Entidades não são EJBs. São puramente locais e não podem ser acessadas diretamente de forma remota como os Entity Beans 2.x. Toda entidade tem de ter um construtor sem argumentos e uma chave primária.

EntityManager

Gerencia o ciclo de vida da entidade.

Ciclo de Vida de uma Entidade

New: Criada Usando a Palavra-Chave new()

Não tem ID persistente.

Managed: ID Persistente e Contexto de Persistência

  • persist() - persiste uma entidade.
  • refresh() - atualiza o estado de uma entidade.

Removed: Marcada para Exclusão do Banco de Dados

Tem um ID persistente associado a um contexto de persistência; está escalonada para ser excluída do banco de dados.

  • remove() - marca uma entidade para remoção.

Detached: ID Persistente, Sem Contexto de Persistência

Tem um ID persistente, mas não está associada com um contexto de persistência.

  • merge() - sincroniza o estado de entidades desacopladas.

Mapeamento Básico de Entidades

É feito com o uso de anotações nas classes persistentes.

  • @Entity - Marca uma classe como entidade persistente que deve possuir um construtor sem parâmetros.
  • @Table - Define o nome da tabela onde os objetos serão persistidos.
  • @Id - Define o atributo que constitui a chave primária.
  • @GeneratedValue - Define um campo auto incremento.
  • @Column - Define o nome da coluna onde o atributo será salvo.
  • @Transient - Define que um atributo não será salvo no banco de dados.

Consultas Dinâmicas

São definidas na aplicação, criadas pelo Gerenciador de Entidades através do método createQuery(). Podem retornar uma lista de valores, semelhante a um ResultSet; nestes casos, utiliza-se o método getResultList() e uma variável do tipo java.util.List.

Consultas Nomeadas (Estáticas)

São pré-definidas na classe da entidade e podem ser reutilizadas em diferentes pontos da sua aplicação, facilitando assim sua manutenção. São declaradas através das anotações @NamedQueries (define um array de consultas nomeadas) e @NamedQuery (define uma consulta nomeada). A maior vantagem de usar este tipo de consulta é que ela pode ser reexecutada múltiplas vezes, fornecendo diferentes parâmetros para cada execução ocorrida, enquanto nas consultas dinâmicas não teremos essa vantagem. São criadas pelo Gerenciador de Entidades através do método createNamedQuery().

Unidade de Persistência

É um conjunto de classes mapeadas para um banco de dados relacional. Esse mapeamento é feito através de um arquivo XML descritor de implantação chamado persistence.xml, que é gravado na pasta META-INF e que pode conter a configuração de várias unidades de persistência.

Contexto de Persistência (Persistence Context)

Ambiente (sessão) que envolve o conjunto de instâncias de entidades gerenciadas pelo Gerenciador de Entidades (EntityManager).

Gerenciador de Entidades (Entity Manager)

Serviço que gerenciará o conjunto de entidades registradas dentro de um contexto, monitorando as alterações feitas nos objetos deste contexto de persistência e gravando-as no banco de dados.

Provedor de Persistência (Persistence Provider)

É como se fosse um driver JPA para uma determinada ferramenta de mapeamento objeto-relacional. Mais especificamente, é a classe que implementa a interface javax.persistence.PersistenceProvider.

persistence.xml

Neste arquivo, definimos a unidade de persistência, o provedor JPA, a relação de classes que mapeiam entidades e as propriedades do banco de dados utilizado.

Servidor Java EE

Aplicação em Camadas - MVC

  • Componentes e Contêineres

Imagen

Imagen

MVC (Model-View-Controller)

Provê a separação das tarefas de acesso aos dados e lógica de negócio, lógica de apresentação e de integração com o usuário, introduzindo um componente entre os dois: o Controller. O fluxo representa o ciclo de interação e o relacionamento entre cada uma das camadas.

O Controle do Fluxo Geralmente Funciona:

  1. O usuário interage com a interface de alguma forma (por exemplo, o usuário aperta um botão).
  2. O Controller manipula o evento da interface do usuário através de uma rotina pré-escrita.
  3. O Controller acessa o Model, possivelmente atualizando-o de uma maneira apropriada, baseado na interação do usuário (por exemplo, atualizando os dados de cadastro do usuário).
  4. O View obtém seus próprios dados do Model. O Model não toma conhecimento direto da View.
  5. A interface do usuário espera por próximas interações, que iniciarão o ciclo novamente.

Model: Representação do Domínio da Aplicação

Significa a representação do domínio que especifica a informação em que a aplicação opera.

View: Renderiza o Modelo para Interação do Usuário

"Renderiza" o Model em uma forma específica para a interação, geralmente uma interface de usuário.

Controller: Processa Eventos e Altera o Modelo

Processa e responde a eventos, geralmente ações do usuário, e pode invocar alterações no Model.

EJB - Enterprise JavaBeans

EJB (Enterprise JavaBean)

Componente de software padrão executado no lado servidor (camada de negócios) que encapsula a lógica que atende às necessidades de um domínio de negócios. É utilizado na criação de aplicações corporativas distribuídas desenvolvidas com a tecnologia Java. É um dos principais componentes da plataforma Java EE (Java Enterprise Edition).

Contêiner EJB

É o ambiente responsável por gerenciar o ciclo de vida das instâncias das classes bean (objetos EJB) dentro de um servidor de aplicações.

Servidor de Aplicações Java EE

Sistema que deve implementar os seguintes serviços:

  • Enterprise JavaBeans (EJB) - Contêiner EJB
  • Java Persistence (JPA)
  • Java Message Service (JMS)
  • Java Transaction Service/Java Transaction API (JTS/JTA)
  • Servlets e JavaServer Pages (JSP) - Contêiner Web
  • Java Naming and Directory Interface (JNDI)

Quando Usar EJB em Suas Aplicações:

  • Quando a aplicação deve ser escalável, tanto por possuir um número crescente de usuários, quanto por poder estar distribuída em múltiplas máquinas.
  • Quando transações são necessárias para garantir a integridade dos dados.
  • Quando a aplicação possuir um alto número de clientes. Como a lógica de negócio fica nos componentes no lado servidor, a manutenção é facilitada.

Tipos Básicos de Enterprise JavaBeans:

  • Beans de Entidade - Entity Beans (JPA-Entity)

    São persistentes, representam o modelo persistente de dados. São gerenciados pelo serviço EntityManager. Mantêm o estado conversacional entre as chamadas de um cliente para o servidor.
  • Beans de Sessão - Session Beans

    Não são persistentes e não mantêm nenhum estado conversacional entre o cliente e o servidor. São frequentemente utilizados para gerenciar as interações entre os beans de entidade. Representam um fluxo de tarefa, um processo de negócio.
  • Beans Baseados em Mensagens - Message Driven Beans

    Recebem e processam mensagens assincronamente. São utilizados na interação com outros aplicativos através de um serviço de mensagens (JMS). Não possuem interfaces Local, nem Remota. Normalmente implementam a interface MessageListener, implementando assim o método onMessage() onde se localiza a lógica de negócio.

Beans de Sessão - Session Beans

  • Stateful SessionBean (Com Informações de Estado)

    Mantém o estado conversacional entre as chamadas de um cliente para o servidor, o que permite manter dados específicos ao cliente entre invocações de método. É uma extensão do aplicativo cliente. Não são mantidos em um pool de instâncias.
  • Stateless SessionBean (Sem Informações de Estado)

    Não mantém nenhum estado conversacional entre o cliente e o servidor. São mantidos em um pool de instâncias. Possuem um desempenho maior que os beans de sessão com informações de estado. São utilizados para realizar tarefas que sejam realizadas em uma única chamada de método.

Componentes de um Aplicativo que Utiliza Session Beans:

  • Interfaces Remota e/ou Local

    • Interface Remota: Anotada com @javax.ejb.Remote. Define quais os métodos que um cliente tem permissão para invocar.
    • Interface Local: Anotada com @javax.ejb.Local. Define quais os métodos que outro EJB pode invocar dentro da mesma JVM.
  • Classe do Bean

    Anotada com @javax.ejb.Stateless ou @javax.ejb.Stateful; contém a lógica de negócio, implementando os métodos descritos nas interfaces remota e/ou local e opcionalmente as interfaces de negócio.
  • Cliente Remoto

    Aplicação que se conecta ao servidor EJB. Por meio da API JNDI, ele localiza a interface remota do EJB a ser utilizado e através da referência dessa interface aciona os métodos remotos do componente EJB.

Métodos Locais e Remotos:

Métodos locais são aqueles executados dentro de uma mesma instância JVM e não possuem cópias replicadas em outros servidores. Já os métodos remotos são executados em outra instância JVM, que pode ou não estar fisicamente no mesmo servidor.

Entradas relacionadas: