Entity Beans Marco Antonio Arquiteto de Software Dezembro/2007 Introdução EJB responsável pela persistência dos objetos. Existem dois tipos: CMP e BMP. CMP – Container Managed Persistence: o AppServer cria o código SQL, controla o pool de objetos e as transações. BMP – Bean Managed Persistence: o AppServer gerencia o pool de objetos e as transações, mas o código SQL é gerado pelo programador. Considerações A utilização de Entity Beans deve sempre levar em consideração as boas práticas de programação. Novos recursos têm sido criados para melhorar a eficiência do EJB. Assim como é recomendável utilizar apenas Session Beans Stateless por causa da performance (Stateful utiliza muito recurso do servidor), é altamente recomendável que não utilizemos as interfaces remotas para os Entity Beans. Existe uma alternativa. Tecnologias concorrentes • Existem diversos frameworks de mapeamento de dados, os mais importantes são: – Hibernate – TopLink – EJB3 New entity bean • No exemplo, vamos criar o entity bean Cliente (cpf, nome, endereco, telefone) New XDoclet EJB Criação do EJB Criação do EJB Entity bean • Name: nome do ejb • Schema: database (a seguir) • Descrição: breve descrição do componente • Versão: 2.1 • Usecase: O EJB irá criar a tabela e não o contrário Atributos do EJB • O EJB irá criar a tabela Cliente com os seguintes atributos: – – – – Cpf Nome Endereco Telefone Passos finais • O EJB está pronto • O próximo passo é configurar o banco de dados Configuração do XDoclet • O XDoclet gera diversas classes utilitárias • Nem todas são utilizadas nesse exemplo, dessa forma, vamos eliminar algumas opções XDoclet • Observe algumas configurações importantes: – Datasource – Createtable Métodos de inclusão • Cada entity deve ter ao menos um método create, que será usado para inserir os dados nas respectivas colunas da tabela • Para cada ejbCreate, é necessário um ejbPostCreate com os mesmos parâmetros ejbCreate public java.lang.String ejbCreate(String cpf, String nome, String endereco, String telefone, Double saldo, Double limite) throws javax.ejb.CreateException { setCpf(cpf); setNome(nome); setEndereco(endereco); setTelefone(telefone); setSaldo(saldo); setLimiteDeChequeEspecial(limite); return null; } ejbPostCreate public void ejbPostCreate(String cpf, String nome, String endereco, String telefone, Double saldo, Double limite) throws javax.ejb.CreateException { } Datasource Arquivo de configuração do banco de dados do sistema. Datasource: fonte de dados, conexão com uma base de dados. Copie no diretório de deploy do JBoss (jboss/server/default/deploy). sisban-ds.xml <?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>sisban</jndi-name> <connection-url>jdbc:postgresql://localhost:5432/sisban</connection-url> <driver-class>org.postgresql.Driver</driver-class> <user-name>postgres</user-name> <password>postgres</password> <min-pool-size>5</min-pool-size> <max-pool-size>20</max-pool-size> <idle-timeout-minutes>1</idle-timeout-minutes> <metadata> <type-mapping>PostgreSQL 8.0</type-mapping> </metadata> </local-tx-datasource> </datasources> sisban-ds.xml • • • • • • • • jndi-name: nome da conexão connection-url: endereço do servidor de BD driver-class: nome da classe do driver JDBC user-name: usuário do BD password: senha do BD min-pool-size: quantidade inicial de conexões max-pool-size: quantidade máxima de conexões type-mapping: mapeamento do BD (Postgre, Oracle, Informix, SQLServer) Driver JDBC do PostgreSQL • Quando uma apliação Java precisa se comunicar com um banco de dados, precisamos registrar seu drive JDBC • Procure o arquivo postgre-8.2-505.jdbc2.jar e copie no diretório de libs do JBoss Administrator do PostgreSQL • Após a instalação do Postgre, abra o pgAdmin Senha • Informe a senha Database • Crie o database sisban • Todas as tabelas do nosso exemplo estarão aí dentro • Navegue pelo administrator até encontrar a lista de tabelas (nenhuma foi criada ainda) Deploy e criação das tabelas • Levante o servidor e faça o deploy da aplicação • Observe as mensagens • Esse ponto é crítico, pois qualquer erro irá derrubar o deploy. É necessária muita atenção Mensagem de sucesso • A saída esperada no console é a que você acompanha na imagem • Após o deploy, a tabela Cliente será criada • Acompanhe pelo administrator Dados da tabela • Clique na opção View the Data para consultar os dados da tabela Clientes • Vamos criar várias classes para as diversas operações de banco de dados – – – – Inclusão Alteração Exclusão Consulta todos os registros Inclusão package net.sistemabancario.entidades.cliente; import net.sistemabancario.entidades.Cliente; import net.sistemabancario.entidades.ClienteHome; import net.sistemabancario.entidades.ClienteUtil; public class TesteInclusaoCliente { public static void main(String[] args) { try { ClienteHome home = ClienteUtil.getHome(); Cliente cliente = home.create("83286950150", "Marco", "QE04", "8119", 0.0, 2000.0); System.out.println("Cliente incluido com sucesso"); } catch (Exception e) { e.printStackTrace(); } } } • Execute a classe algumas vezes para inserir dados na tabela Dados da tabela • Atualize a tela de consulta e acompanhe a inclusão dos registros Atualização package net.sistemabancario.entidades.cliente; import net.sistemabancario.entidades.Cliente; import net.sistemabancario.entidades.ClienteHome; import net.sistemabancario.entidades.ClienteUtil; public class TesteAlteracaoCliente { public static void main(String[] args) { try { ClienteHome home = ClienteUtil.getHome(); Cliente cliente = home.findByPrimaryKey("83286950149"); cliente.setEndereco("Novo Endereço"); System.out.println(cliente.getCpf()); System.out.println(cliente.getNome()); System.out.println(cliente.getEndereco()); System.out.println(cliente.getTelefone()); System.out.println(cliente.getSaldo()); System.out.println(cliente.getLimiteDeChequeEspecial()); } catch (Exception e) { e.printStackTrace(); } } } Exclusão package net.sistemabancario.entidades.cliente; import net.sistemabancario.entidades.ClienteHome; import net.sistemabancario.entidades.ClienteUtil; public class TesteExclusaoCliente { public static void main(String[] args) { try { ClienteHome home = ClienteUtil.getHome(); home.remove("83286950149"); System.out.println("Cliente excluido com sucesso"); } catch (Exception e) { e.printStackTrace(); } } } Consulta todos package net.sistemabancario.entidades.cliente; import java.util.Collection; import net.sistemabancario.entidades.Cliente; import net.sistemabancario.entidades.ClienteHome; import net.sistemabancario.entidades.ClienteUtil; public class TesteConsultaClientes { public static void main(String[] args) { try { ClienteHome home = ClienteUtil.getHome(); Collection<Cliente> lista = home.findAll(); for (Cliente cliente : lista) { System.out.println(cliente.getCpf()); System.out.println(cliente.getNome()); System.out.println(cliente.getEndereco()); System.out.println(cliente.getTelefone()); System.out.println(cliente.getSaldo()); System.out.println(cliente.getLimiteDeChequeEspecial()); System.out.println("-------------"); } } catch (Exception e) { e.printStackTrace(); } } } Exercícios • Crie o entity bean para ContaCorrente (numero, saldo, limiteDeChequeEspecial) – O código do cliente será implementado em uma versão futura Dúvidas?