410 likes | 508 Views
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.
E N D
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)
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); returnnull; }
ejbPostCreate publicvoid 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; publicclass TesteAlteracaoCliente { publicstaticvoid 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; publicclass TesteExclusaoCliente { publicstaticvoid 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; publicclass TesteConsultaClientes { publicstaticvoid 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