Entity Beans
Introdução Entity Beans
BMP
Agenda
Conceitos básicos de persistência
Definição de entity beans
Recursos
Conceitos de programação
Típos de entity beans
Exemplos de entity beans usando
Introdução
Entity beans são objetos persistentes que
podem ser armazenados em meio
persistente de armazenamento
Pode-se fazer modelagem de dados como
Entity Beans
Persistência
Uma maneira de armazenar o estado de objetos
Java é através da serialização
Vantagem: facilidade de leitura e gravação: objeto pode ser enviado pela rede, armazenado em um banco ou árvore JNDI
Desvantagem: inviabilidade de realização de pesquisa sobre campos dos objetos: qualquer pesquisa
necessitaria a desserialização de cada objeto para obter os campos pesquisados
Conclusão: para persistência de grande quantidade de dados que precisam de expor seus dados como
atributos de pesquisa, serialização não é viável (solução seria serialização em XML!)
Persistência (…)
Soluções alternativas
Bancos de dados relacionais: oferecem recursos
poderosos e eficientes de busca, mas, não são
orientados a objeto (SQLJ, JDBC)
Bancos de dados orientados a objeto
Mapeamento objeto-relacional (O/R Mapping)
Mapeamento Objeto-Relacional
Em vez de serializar os objetos, decompomos cada um em
suas partes e guardamos suas partes no banco
2750 Maria 3 1500 Roberto 2 1000 João 1 Saldo Titular NConta
Tabela de contas – Banco relacional Classe Conta String Nconta String Titular Double Saldo Instância de Conta Nconta = 3 Titular = Maria Saldo = 27500
O que é um Entity Bean?
Session beans modelam a lógica relacionada a
tarefas realizadas pela aplicação
Entity beans modelam entidades
São componentes que representam dados
Session beans podem guardar informações em bancos de dados mas não "representam" dados.
Entity beans são os dados
O que é um Entity Bean?(…)
Permitem que se manipule com objetos
ignorando a forma de armazenamento
A especificação não define nenhum tipo obrigatório
Duas partes
Entity bean instance:
dados na memória (representa uma instância da classe do
Entity Bean)
Entity bean data:
Partes de um entity bean
Como qualquer EJB, um Entity Bean possui
Uma interface Home ou LocalHome Uma interface Remote ou Local Um deployment descriptor Uma classe EJB
Partes de um entity bean(...)
As diferenças são
A classe do EntityBean está mapeada à uma definição de entidade de um esquema de banco de dados (uma tabela, por exemplo)
Há métodos especiais que lidam com a sincronização do EntityBean com os banco de dados
Um entity bean tem uma classe Primary Key que permite identificar univocamente sua instância
Entity Beans sobrevivem
Entity Beans são objetos persistentes
Sobrevivem à quedas do servidor ou banco de dados Por serem apenas representação de dados de um meio de
armazenamento, o bean pode ser reconstruido lendo seus dados do banco.
Ciclo de vida muito longo
Existem enquanto existir a tabela ou entidade que representam seus dados no banco
Sincronismo
Uma instância de um entity bean é uma visão do
banco de dados
A instância está sempre sincronizada com os dados
do banco. Container possui mecanismo que faz a
atualização após cada alteração
Todas as classes implementam métodos que realizam essa atualização
Sincronismo
void ejbLoad()
lê os dados do banco para dentro do entity bean
void ejbStore()
grava os dados do entity bean no banco
ejbLoad() e ejbStore()
Este ciclo de métodos de negócio ejbLoad() – ejbStore() pode ser repetido muitas vezes.
1 - ejbLoad 4 - ejbStore Dados do Entity Bean 5 – Escreve no banco 2 – Lê do banco Banco de Dados Instância do
Entity Bean 3 -Métodosde Negócio
Uso e reuso de Entity Beans
Instâncias diferentes de entity beans podem
representar os mesmos dados
Transações permitem isolamento necessário
para evitar corrupção
Mesmas instâncias podem representar dados
diferentes
Uso e reuso de Entity Beans (…)
O EJB Container pode atribuir dinamicamente instâncias de Entity Beans para representar
Instâncias de Entity Beans Objeto EJB 1 Conta: Linair Objeto EJB 2 Conta: Luis Objeto EJB 3 Conta: Flavia
EJB Container Server
Bean Pool Cliente 1 Linair Cliente 2 Luis Cliente 3 Flavia Interface remota Interface remota Interface remota
Duas formas de persistência
Entity beans podem ser associados ao meio de
armazenamento de duas formas
BMP - Bean Managed Persistence
O bean deve usar uma API (JDBC, SQLJ) para fazer as chamadas de UPDATE no ejbStore(), INSERT no
ejbCreate(), SELECT no ejbLoad(), etc. (caso use banco relacional)
CMP - Container Managed Persistence
O container faz um mapeamento dos objetos a entidades em um banco
Métodos de ciclo de vida, campos de dados e métodos de negócio são gerados automaticamente pelo container
Criação de Entity Beans
Como Entity Beans
são
os dados, criar um bean é
inserir dados em um banco; remover um bean é
apagar esses dados
Entity Beans são criados através do EJBObject
(proxy) via sua interface Home.
Para cada método create da interfaceHome deve
haver um método ejbCreate correspondente no
Bean:
Na Home:
public Accountcreate(String id, String owner)
No Bean:
publicAccountPKejbCreate(String id, String owner) {}
Remoção de Entity Beans
Para destruir um bean, é preciso chamar
remove()
em Home
ejbRemove()
deve localizar a chave primária do
bean atual para removê-lo através o método
getPrimaryKey() do contexto.
ejbCreate()
EJB Container Server
Instância de Entity Bean Objeto Home Objeto EJB Código Cliente 1:Create() Dados do Entity Bean 2:ejbCreate() 4:Retorna Primary Key 5: Cria Objeto EJB 3:Cria Dados no Banco 6: Retorna Objeto EJB
Relação entre create() e ejbCreate().
O diagrama omite algumas etapas secundárias e assume persistência
ejbRemove()
Instância de Entity Bean
EJB Container Server
Objeto Home Objeto EJB Código Cliente 1:remove() Dados do Entity Bean 2:ejbRemove() 2:ejbRemove() 3:Remove Dados do Banco 1: remove()
Destruindo uma representação de dados de um Entity Bean
Relação entre remove() e ejbRemove().
Note que remove() pode ser chamado tanto no objeto Home como no EJB
Entity Beans podem ser localizados
Entity Beans nem sempre precisam ser criados.
Podem já existir no banco
Neste caso, devem ser localizados
Todo bean pode ser localizado através de sua chave primária
Métodos find() adicionais podem ser criados para localizar beans de acordo com outros critérios
Finder methods
No home: findByXXX() No EJB: ejbFindByXXX()
Deve existir pelo menos o findByPrimaryKey() Método create() é opcional
Entity Beans podem ser modificados sem EJB
Não é preciso usar EJB para modificar o conteúdo
de Entity Beans
Como Entity Beans representam dados externos, se esses dados puderem ser alterados externamente, sua mudança será refletida no Entity Bean
Riscos:
cache de entity beans pode causar inconsistência
Entity Beans podem ser modificados sem EJB
Modificando manualmente a representação de um Entity Bean no banco de dados
Dados do Entity Bean
Banco de Dados Relacional Aplicação
Existente Entity
Beans
EJB Container Server
Mapeamento O / R
Modificações Diretas no
Classe Primary Key
Valor que identifica de forma única o objeto
no banco de dados
Implementa java.io.Serializable
Implementa
hashCode() equals() toString()Contextos das Entity
Todo bean possui um objeto de contexto No caso do Entity Bean é ojavax.ejb.EntityContext Através dele pode-se chamar os métodos
getEJBObject():retorna uma referência para o EJBObject
(interceptador, que implementa Remote)
getEJBLocalObject():retorna uma referência local para o
interceptador
getPrimaryKey():retorna a chave primária associada com a
entidade atual.
getPrimaryKey() é essencial em ejbLoad() e
ejbRemove()
descobrir qual a instância que será carregada ou removida,
Métodos da Interface Home
Remote
create
(...)
Retorna uma referência para o bean criado
Pode retornar uma Collection (ou Set) de referências Opcional
Remote
findXxx
(...)
Retorna uma referência para bean existente
Pode retornar uma Collection (ou Set) de referências Deve haver pelo menos findByPrimaryKey()
tipo
xxx
(...)
Método chamado na interface Home não se refere a nunhuma instância particular
Deve ter um correspondente ejbHomeXxx()no bean com mesmos argumentos e tipo de retorno
Métodos de um Entity Bean (1)
void
setEntityContext
(EntityContext ctx)
Obtém o contexto do Entity Bean. Pode ser usado para obter a chave primária da instância atual
PK
ejbFindXXX
(...)
Deve haver pelo menos ejbFindByPrimaryKey(), que devolve a própria PrimaryKey
Cada método ejbFind() deve devolver ou a chave primária ou uma Collection de PKs (pode ser Set)
tipo
ejbHomeXXX
(...)
Métodos de Home que não se referem a nenhuma instância em particular. XXX é o nome do método na interface Home.
Métodos de um Entity Bean (2)
PK
ejbCreate
(...)
Não precisa existir um ejbCreate()
Deve retornar PK ou Collection de PKs (pode ser Set)
void
ejbPostCreate
(...)
Deve haver um para cada ejbCreate() com mesmos argumentos.
void
ejbActivate
()
Chamado logo após a ativação do bean
void
ejbLoad
()
Chamado para ou logo depois que o bean for povoado com os dados oriundos do banco
antes de qualquer alteração nos dados do bean
void
ejbStore
()
Chamado antes que o bean seja armazenado no banco depois de qualquer alteração nos dados do bean
void
ejbPassivate
()
Chamado antes da passivação do bean
Métodos de um Entity Bean (4)
void
ejbRemove
()
Chamado antes (ou para) que os dados sejam removidos do banco
void
unsetEntityContext
()
destrói instância
será recolhida pelo garbage collect.
destrói o objeto, mas não o entity bean (que são os dados)
O ciclo de vida de um Entity bean com persistência gerenciada.
Não Existe Pronto Pooled ejbHome() ejbFind() ejbRemove() ejbStore() ejbLoad() ejbCreate() ejbPostCreate() 1: newInstance()
2: setEntityContext() 1: unsetEntityContext()2: JVM WIII Garbage Colect e Call finalize()
1: ejbActivate()
2: ejbLoad() 1: ejbStore()
2: ejbPassivate()
Ativando o seu
bean Passivandoo seu bean
Cada chamada de método mostrada é uma invocação de
Diagrama de Classe de um Entity
Bean
javax.ejb.EntityBean activate() passivate() remove() load() store() setEntityContext(EntityContext) unsetEntityContext() BankBean BankBeanRemote <<Interface>> javax.ejb.EJBObject<<Interface>>BankBean implements the business methods of the BankBeanRemote interface. javax.ejb.EJBHome<<Interface>>
BankBeanHome <<Interface>>
Diagrama de Sequência para encontrar um
objeto EJB (BMP)
client EJB home EJB object entity bean instance
database
Classes fornecidas pelo container :
find<METHOD>(args) ejbFind<METHOD>(args)
search DB new