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?
Download

Entity Beans