Entity Beans CMP O que é CMP?

Transcrição

Entity Beans CMP O que é CMP?
Entity Beans CMP
O que é CMP?
Criação de Entity Beans CMP
Deployment no JBoss
EJB-QL
Exemplo Prático
O que é CMP?
„
„
„
Container Managed Persistence é a criação
automática de lógica de persistência pelo
servidor de aplicação
O container se encarrega de criar as tabelas
(no deployment), inserir os dados removê-los
e alterá-los
CMP é utilizada na construção de aplicações
totalmente independentes de banco de dados
1
Como CMP Funciona
„
„
O container gera automaticamente código de
persistência ao estender a classe criada pelo
programador
Os campos do Entity Bean são informados no
arquivo XML de descrição, assim como a
lógica dos métodos de seleção e localização:
„
Linguagem: EJB-QL:
„
linguagem de manipulação de dados parecida com SQL
Criação de Entity Beans CMP
„
Um Entity Bean CMP é composto de:
„
uma classe abstrata:
„
„
„
„
estende a classe EntityBean,
uma interface Home Local,
uma interface Local
A classe do Entity Bean é abstrata:
„
os métodos get e set de cada campo e os
métodos de seleção e localização serão
implementados pelo container
2
Criação das Interfaces
„
„
Idênticas às interfaces de um Entity
Bean BMP
Os clientes não precisam ser alterados
se um Entity Bean BMP vira CMP ou
vice versa
Exemplo da Interface Home
public interface ItemHome extends EJBLocalHome {
public Item create(String nome, double preco, int quantidade)
throws CreateException;
public Item findByPrimaryKey(String codigo) throws
FinderException;
public Collection findByNome(String nome) throws
FinderException;
public double getTotal();
}
3
Exemplo da Interface Remote
public interface Item extends EJBLocalObject {
public String getNome();
public void setNome(String name);
public String getCodigo();
public double getPreco();
public void setPreco(double preco);
public int getQuantidade();
public void setQuantidade(int quantidade);
public double getPrecoTotal();
}
Criação da Classe do Entity
Bean CMP (1)
„
A classe do Entity Bean CMP contém
„
Métodos get e set abstratos para cada campo:
„
Implementação de métodos get com a lógica do negócio
„
„
serão implementados pelo container
por exemplo, getTotal():
„
Métodos ejbSelect abstratos
„
Implementação de métodos ejbHome que utilizam métodos
ejbSelect
„
„
„
chama getSubTotal() e getTaxas())
„
lógica definida em EJB-QL no arquivo XML de descrição
por exemplo, ejbHomeGetTotalCompras()
A classe do Entity Bean CMP não contém métodos
ejbFind
„
Declarados e definidos em EJB-QL no arquivo XML de descrição
4
Criação da Classe do Entity
Bean CMP (2)
„
Assim como BMP, a classe do Entity Bean CMP
contém os métodos
setEntityContext():
„
„
chamado quando o container aumenta o pool (o bean ainda não
foi inicializado)
unsetEntityContext():
„
„
chamado quando o container diminui o pool
ejbCreate():
„
„
deve chamar métodos set com os dados de inicialização
ejbPostCreate():
„
„
chamado após a criação do bean, com a chave primária
disponível para uso
Criação da Classe do Entity
Bean CMP (3)
„
Assim como BMP, a classe do Entity Bean CMP contém os
métodos
„
ejbActivate():
„
ejbPassivate():
„
„
chamado quando um bean sai do pool para ser usado por um cliente
chamado quando um bean retorna ao pool após ser usado por um
cliente
„
ejbLoad():
„
ejbStore():
„
„
„
chamado após a leitura de dados
chamado antes da gravação dos dados
ejbRemove():
„
chamado antes da remoção dos dados
5
Exemplo da Classe do Entity
Bean CMP (1)
public abstract class ItemBean implements EntityBean {
private EntityContext ctx;
public abstract String getNome();
public abstract void setNome(String name);
public abstract String getCodigo();
public abstract void setCodigo(String codigo);
public abstract double getPreco();
public abstract void setPreco(double preco);
public abstract int getQuantidade();
public abstract void setQuantidade(int quantidade);
public double getPrecoTotal() {
return getPreco() * getQuantidade();
}
Exemplo da Classe do Entity
Bean CMP (2)
public
public
public
public
public
public
public
public
void
void
void
void
void
void
void
void
ejbPostCreate(String nome) {}
ejbStore() {}
ejbLoad() {}
ejbPassivate() {}
ejbRemove() {}
ejbActivate() {}
setEntityContext(EntityContext c) {ctx = c;}
unsetEntityContext() {ctx = null;}
6
Exemplo da Classe do Entity
Bean CMP (3)
public abstract Collection ejbSelectPrecosTotais();
public double ejbHomeGetTotal() {
double total = 0.0;
Iterator it = ejbSelectPrecosTotais().iterator();
while (it.hasNext()) {
Double precoTotal = (Double) it.next();
total += precoTotal.doubleValue();
}
return total;
}
}
public void ejbCreate(String nome, double preco, int quantidade) {
setNome(nome); setPreco(preco); setQuantidade(quantidade);
}
Deployment no JBoss
„
Arquivo ejb-jar.xml
„
„
Arquivo jboss.xml
„
„
Nomes JNDI
Arquivo jbosscmp-jdbc.xml
„
„
„
Esquema abstrato de mapeamento
Definição do data source
Mapeamento Físico
Deployment da aplicação
7
Inserção do EJB no arquivo
ejb-jar.xml (1)
<ejb-jar>
<enterprise-beans>
...
<entity>
<ejb-name>Item</ejb-name>
<home>com.empresa.pacote.ItemHome</home>
<local>com.empresa.pacote.Item</local>
<ejb-class>com.empresa.pacote.ItemBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.String</prim-key-class>
<prim-key-field>codigo</prim-key-field>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Item</abstract-schema-name>
<cmp-field><field-name>codigo</field-name></cmp-field>
<cmp-field><field-name>nome</field-name></cmp-field>
<cmp-field><field-name>quantidade</field-name></cmp-field>
Inserção do EJB no arquivo
ejb-jar.xml (2)
<cmp-field><field-name>preco</field-name></cmp-field>
<query>
<query-method>
<method-name>findByNome</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>
<![CDATA[SELECT OBJECT(i) FROM Item AS i WHERE nome = ?1]]>
</ejb-ql>
</query>
<query>
<query-method>
<method-name>ejbSelectPrecosTotais</method-name>
<method-params></method-params>
</query-method>
8
Inserção do EJB no arquivo
ejb-jar.xml (3)
<ejb-ql><![CDATA[SELECT quantidade*preco FROM Item AS i]]></ejb-ql>
</query>
</entity>
...
</enterprise-beans>
<assembly-descriptor>
...
<container-transaction>
<method>
<ejb-name>Item</ejb-name>
<method-intf>Local</method-intf>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
...
</assembly-descriptor>
...
</ejb-jar>
Inserção do EJB no arquivo
jboss.xml
<jboss>
...
<entity>
<ejb-name>Item</ejb-name>
<jndi-name>com/empresa/pacote/Item</jndi-name>
<resource-ref>
<res-ref-name>jdbc/ItemDB</res-ref-name>
<resource-name>java:/OracleDS</resource-name>
</resource-ref>
</entity>
...
</jboss>
9
Arquivo jbosscmp-jdbc.xml
<jbosscmp-jdbc>
<defaults>
<datasource>java:/OracleDS</datasource>
<datasource-mapping>Oracle9i</datasource-mapping>
<create-table>true</create-table>
<remove-table>true</remove-table>
</defaults>
<enterprise-beans>
<entity>
<ejb-name>Item</ejb-name>
<table-name>ItemTable</table-name>
<cmp-field>
<field-name>codigo</field-name>
<column-name>itemid</column-name>
</cmp-field>
<cmp-field>
<field-name>nome</field-name>
<column-name>name</column-name>
</cmp-field>
<cmp-field>
<field-name>quantidade</field-name>
<column-name>qtde</column-name>
</cmp-field>
...
</entity>
</jbosscmp-jdbc>
EJB-QL (1)
„
„
„
„
„
Enterprise Java Beans Query Language
Linguagem parecida com SQL
Cláusulas SELECT, FROM e WHERE
Não possui cláusulas ORDER BY e
GROUP BY
Não possui funções de agregação
MIN(), MAX(), COUNT() e SUM()
10
EJB-QL (2)
„
Cláusula SELECT
„
Tipo de Retorno:
„
Métodos finder:
„
„
Métodos Find da Home:
„
„
„
Tipo do esquema abstrato do Entity Beans
„ Interface Local ou Remota
Interface remota ou local (ou a coleção)
Função OBJECT() para a projeção de tipos
complexos
Ex:
„
„
SELECT OBJECT (i) FROM Item AS i
SELECT DISTINCT i.nome FROM Item AS i
EJB-QL (3)
„
Expressões funcionais:
„
EJB-QL possui funções CONCAT(),
SUBSTRING(), LOCATE(), LENGTH(),
ABS(), SQRT(), MOD(), COUNT(), MAX( ),
MIN( ), AVG( ) e SUM( )
„
„
EJB 2.1
Ex:
„
SELECT COUNT( c ) FROM Customers AS c
WHERE c.address.state = 'WI'
11
EJB-QL (4)
„
Expressão BETWEEN
„
„
Verifica se uma expressão aritmética está
dentro de uma Faixa de valores
Ex:
„
SELECT OBJECT(i) FROM Item AS i WHERE
i.nome = ?1 OR (i.preco BETWEEN ?2 AND ?3)
EJB-QL (5)
„
Expressões IN, LIKE, e ORDER BY:
„
Ex:
„
„
o.country IN ('UK', 'US', 'France')
address.phone LIKE '12%3'
„
„
„
Verdadeiro: '123‘ e '12993'
Falso: '1234'
SELECT OBJECT( c ) FROM Customers AS c
ORDER BY c.lastName
„
EJB 2.1
12
Exercício
„
Transformar o Entity Bean do exercício
da aula de BMP em CMP
„
„
„
Alterar a classe do Entity Bean
Alterar os arquivos ejb-jar.xml e jboss.xml
Fazer o deployment
13