Entity Beans Marco Antonio Arquiteto de Software Dezembro/2007.

Post on 22-Apr-2015

111 views 0 download

Transcript of Entity Beans Marco Antonio Arquiteto de Software Dezembro/2007.

Entity BeansMarco AntonioArquiteto de SoftwareDezembro/2007

IntroduçãoEJB 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çõesA 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

ejbCreatepublic 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;}

ejbPostCreatepublic void ejbPostCreate(String cpf, String nome, String

endereco, String telefone, Double saldo, Double limite) throws javax.ejb.CreateException {

}

DatasourceArquivo 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ãopackage 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çãopackage 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ãopackage 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 todospackage 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?