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