Sunteți pe pagina 1din 73

Tecnologia Enterprise JavaBeans 3.

0
Novidades

Luiz Henrique Santanna Barbosa Consultor J2EE


Evento Nacional Java

Objetivo

Aprender e analisar as inovaes trazidas pela tecnologia EJB 3.0

One Day Java 4

Programao
Objetivos da tecnologia EJB 3.0 Viso geral da API simplificada EJB Viso mais detalhada Java Metadata Interface Software Novidades com os Session beans Acesso ao ambiente Entity beans Sumrio e status atual Mais informaes
One Day Java 4 3

Objetivo principal: Simplificar o desenvolvimento


Simplificar o desenvolvimento com EJB
API mais simplificada Eliminar a necessidade de deployment descriptors Possibilitar testes para beans fora do Container Aumentar a produtividade do desenvolvedor

Alcanar uma gama maior de desenvolvedores


Simplificar a API para os desenvolvedores em geral Alcanar mais desenvolvedores profissionais

One Day Java 4

Objetivos do Expert Group da tecnologia EJB 3.0


Definir a API simplificada do EJB 3.0 Exame crtico da atual verso do EJB
Limitao de design, anti-patterns, complexidade, quantidade excessiva de cdigo, melhorias no EJBQL, simplificar depurao e teste

Manter o foco nos cenrios mais comuns Assegurar a compatibilidade com as verses 2.x

One Day Java 4

Modelo atual

O modelo to ruim que precisa de patterns? Ou O modelo to bom que permite o uso de patterns?

One Day Java 4

Viso geral da tecnologia EJB 3.0: Metadata - Objetivos


Incentivar a utilizao de metadata annotations (JSR 175, parte da tecnologia J2SE 1.5 estilo XDoclet)
Reduzir o nmero de ferramentas que o desenvolvedor necessita para produzir Eliminar a necessidade do deployment descriptor

Configurao atravs de excees


Existncia de valores padres (metadata) Eliminar a necessidade de especificar comportamentos comuns
One Day Java 4 7

Viso geral da tecnologia EJB 3.0: Ambiente


Simplificao do acesso ao environment e runtime context do Bean
Encapsulamento do acesso a dependncias de ambiente e ao contexto JNDI atravs de: Metadata annotations - @Resource(name, resourceType) Dependency inject - @Inject Acesso simplificado para outros componentes @EJB(name, businessInterface), @EJBHome Outra possvel soluo: Pattern ServiceLocator

(Core J2EE Patterns)


One Day Java 4 8

Viso geral da tecnologia EJB 3.0: POJO Beans - Objetivos


Simplificao dos tipos de beans (Plain Old Java Objects) Elimina a necessidade de component interfaces
Para Session beans, sero usadas POJIs No h necessidade para Entity beans

Elimina a necessidade de Home Intefaces Elimina a necessidade de implementar mtodos callback


Permite a seleo de quais mtodos sero implementadas atravs de annotations
One Day Java 4 9

Viso geral da tecnologia EJB 3.0: CMP


Simplificao de CMP
Utilizao de POJO/JavaBeans Utilizao do new()

Possibilidade de testes fora do Container Possibilidade de outras formas de modelagem


Herana e polimorfismo Object / Relational mapeamento atravs de metadata

Eliminao da necessidade de Data Transfer Objects (Value Objects) e outros patterns


One Day Java 4 10

Viso geral da tecnologia EJB 3.0: EJBQL


Novas funcionalidades
Bulk operations (DELETE / UPDATE) Projeo de campos (SELECT) Subqueries Inner / outer joins Group By / Having Mais funes Queries dinmicas

Suporte maior para SQL queries


One Day Java 4 11

Programao
Objetivos da tecnologia EJB 3.0 Viso geral da API simplificada EJB Viso mais detalhada Java Metadata Interface Software Novidades com os Session beans Acesso ao ambiente Entity beans Sumrio e status atual Mais informaes
One Day Java 4 12

Java Programming Language: Interface Metadata


Annotations podem ser aplicadas em classes, mtodos, campos, etc.
Compilados junto com as classes e disponvel em runtime

Simples ou complexas (estruturadas) Pode usar defaults (Configuration by exception) Podem executar processos
Gerar novos arquivos / classes No pode alterar cdigo fonte ou bytecode
One Day Java 4 13

Java Programming Language: Interface Metadata


Maior possibilidades para a tecnologia EJB
Gera interfaces Elimina deployment descriptors Demarcao de injection e pontos para o Container interferir no comportamento

Possibilitar o uso de padres com metadata


Valores padres para as annotations As annotations por si s sero usadas apenas em casos que no usem padres

fcil de usar com uma grande capacidade (estilo XDoclet)


One Day Java 4 14

Viso geral da tecnologia EJB 3.0: Metadata (estilo XDoclet)

Fonte: http://www.theserverside.com
One Day Java 4 15

Viso geral da tecnologia EJB 3.0: Session Beans


Uma viso geral com um exemplo simples da tecnologia EJB O ponto de partida para introduzir as novidades do EJB 3.0...

One Day Java 4

16

Tecnologia EJB 2.1: Stateless Session Beans

//Component interface public interface Calculadora extends EJBObject { int adicionar(int a, int b) throws RemoteException; int subtrair(int a, int b) throws RemoteException; }

//Home Interface public interface CalculadoraHome extends EJBHome{ public Calculadora create() throws CreateException, RemoteException; }

One Day Java 4

17

Tecnologia EJB 2.1: Stateless Session Bean Class


public class Calculadora Bean implements SessionBean{ private SessionContext ctx; public void setSessionContext(SessionContext ctx){ this.ctx = ctx; } public void ejbCreate(){} public void ejbPassivate(){} public void ejbActivate(){} public void ejbRemove(){} public int adicionar(int a, int b){ return a + b; } public int subtrair( int a, int b){ return a b; } } One Day Java 4 18

Tecnologia EJB 2.1: Deployment Descriptor


<ejb-jar> ... <session> <ejb-name>CalculadoraBean</ejb-name> <home>my.package.CalculadoraHome</home> <remote>my.package.Calculadora</home> <ejb-class>my.package.CalculadoraBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> ... </ejb-jar>

One Day Java 4

19

Tecnologia EJB 2.1: Crticas a este modelo


Pesado para se desenvolver (3 classes + xml) Interfaces s atrapalham
Create no cria nada Stateless session beans so criados pelo Container e mantidos num pool Remove no remove Aps o uso do cliente eles so devolvidos ao pool e s removidos quando o Container determinar

Deployment Descriptor
Ruim para se trabalhar Contm informaes redundantes Estrutura no entra em conformidade com as classes dos beans One Day Java 4 20

Tecnologia EJB 3.0: O mesmo exemplo


//Bean class @Stateless public class CalculadoraBean implements Calculadora { public int adicionar(int a, int b){ return a+b; } public int subtrair(int a, int b){ return a-b;} } //Component interface public interface Calculadora{ public int adicionar(int a, int b); public int subtrair(int a, int b); }

One Day Java 4

21

O mesmo exemplo com as interfaces geradas pelas annotations


//Bean class @Stateless public class CalculadoraBean { public int adicionar(int a, int b){ return a+b; } public int subtrair(int a, int b){ return a-b; } }

One Day Java 4

22

O mesmo exemplo com acesso Remoto


//Bean class @Stateless @Remote public class CalculadoraBean { public int adicionar(int a, int b){ return a+b; } public int subtrair(int a, int b){ return a-b; } }

One Day Java 4

23

EJB 3.0: Simplificaes

No h mais a necessidade para Home interfaces Business interface POJI

O bean pode implement-la ou ela pode ser gerada O bean pode ter mais de uma business interface Pode ou no ter acesso remoto RemoteException foi removida do ponto de vista do programador Eliminou tambm o EJB(Local)Object do ponto de vista do programador

Eliminou os mtodos de callback desnecessrios da interface SessionBean.


One Day Java 4 24

Simplificaes com o uso de valores padres


O uso de metadata foi minimizado
Gerao de interface padro Padro de nomes (class sufixo = interface) Valor padro para transaction type (Container) Valor padro para transaction attributes (Required tambm tinha no Deployment Descriptor) Valor padro para segurana (unchecked tambm tinha no Deployment Descriptor) Valor padro para caller identity (@RunAs) Etc.

One Day Java 4

25

Stateful Session Beans


Tambm no precisam das interfaces Home nem Component A criao do Stateful Session Bean para o programador na verdade a iniciao do processo O remove do Stateful Session Bean importante
Porm ser usado uma annotation

One Day Java 4

26

Stateful Session Bean


@Stateful public class ShoppingCartBean { public String customer; public void iniciarCompras(String s){ customer = s; } public void adicionarItem(Item i){ ... } @Remove public void finalizarCompras(){ ... } }
One Day Java 4 27

Stateful Session Beans


No precisam das interfaces Home nem Component A criao do Stateful Session Bean no precisa mais ser feita atravs do ejbCreate() abrindo mo de nomes sobrecarregados (overloaded) O ejbRemove passa a corresponder a um mtodo que faz parte do processo (finalizarCompras) e marcado com uma annotation
One Day Java 4 28

Acesso ao ambiente simplificado


Elimina a API de JNDI do ponto de vista do desenvolvedor (uma possvel alternativa: ServiceLocator) Mecanismos Expresses declarativas de dependncias com metadata Injection das dependncias automtica Lookups programados simplificados Mais fcil, rpido e dinmico
One Day Java 4 29

Acesso ao ambiente no EJB 2.1


//dentro do mtodo ... try{ InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup( "java:comp/env/jdbc/myDS"); Connection cn = ds.getConnection(); } catch(Exception e){ ... } <!-- deployment descriptor --> ... <resource-ref> <description>O Data source padro</description> <res-ref-name>jdbc/myDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
One Day Java 4 30

Acesso ao ambiente no EJB 3.0


@Stateless public class MySessionBean { @Resource(name=myDB) public DataSource customerDB; public void myMethod(String str){ try{ Connection cn = customerDB.getConnection(); } catch(Exception e) { ... } } }

One Day Java 4

31

Utilizando Injection com get/set


@Stateless public class MySessionBean { public DataSource customerDB; @Resource(name=myDB) public void setDataSource(DataSource db){ customerDB = db; } public void myMethod(String str){ try{ Connection cn = customerDB.getConnection(); } catch(Exception e) { ... } } }
One Day Java 4 32

@Inject
@Stateless public class MySessionBean { public DataSource customerDB; @Inject public void setCustomerDB(DataSource db){ customerDB = db; } public void myMethod(String str){ try{ Connection cn = customerDB.getConnection(); } catch(Exception e) { ... } } }
One Day Java 4 33

Injection
O Container inicia as dependncias antes que se chame os business methods No precisa mapear os recursos no deployment descriptor Pode ser usado para se obter instncias de EJBContext, EntityManager, resources (DataSource, URL, JMS Topics / Queues, Mail session), outros beans, etc

One Day Java 4

34

Lookup Dinmico
Mtodo lookup() adicionado ao EJBContext Pode-se usar @Inject para obter o EJBContext
... @Inject public void setSessionContext (SessionContext ctx){ this.ctx = ctx; } ... meuBean = (MeuBean) ctx.lookup(meuBean);

One Day Java 4

35

Client View
Elimina-se os Homes
Com metadata, injection e lookup() simplificado, Homes no so necessrias para session beans (tanto stateless quanto stateful) Stateless Session bean Homes j no eram muito teis mesmo

Stateful session bean Homes mtodos create


mas mover a funcionalidade de inicializao do bean para um business method permite que a Home possa ser eliminada @Remove completa o que faltava
One Day Java 4 36

Entity beans: objetivos


Simplificar o modelo Adicionar novas capacidades
Herana e polimorfismo; mapeamento O/R

Permitir uso fora do Container Facilitar o processo de testes e depurao Eliminar a necessidade de data transfer objects (DTOs) / value objects (VOs) BMP est atualmente fora dos objetivos principais Mudanas importantes
One Day Java 4 37

Processo de anlise
Analisar as opes e tecnologias Decidir as prioridades Identificar itens que necessitam mudanas urgentemente
Complexidade
4 classes, DTD, implementao de javax.ejb.EntityBean

Ausncia de testes fora do Container


Classes abstratas, CMRs, create, Home

Melhorias na modelagem e no EJB-QL


Ausncia de funes bsicas, como batches, joins, etc

Questes ligadas a DTO


Os Beans no so Serializable, e, portanto, precisam de DTOs
One Day Java 4 38

Processo de anlise
Itens que precisavam ser preservados
EJB-QL + melhorias
Adicionar aquilo que o EJB-QL no tinha e que obrigava os desenvolvedores a utilizar BMP e SQL: batch updates/deletes, joins, subqueries, etc.

A capacidade do Container de intermediar e administrar os beans


TX/segurana/caching/etc.

One Day Java 4

39

Processo de anlise (cont.)


Manter o foco nas prioridades
Abrir mo de algumas coisas que a gente gostava.... (ex: CMR)

Manter o foco no mapeamento O/R


Bancos de dados no-relacionais no so prioridades Foco em bancos de dados relacionais Segue os passos de outras tecnologias que utilizam de mapeamento O/R como Hibernate, TopLink, etc.

One Day Java 4

40

O que estava faltando?


Um modelo mais conciso de desenvolvimento Polimorfismo Design mais orientado a objetos
Centralizar as operaes dos beans com o EntityManager

Competitividade com outros modelos de persistncia Uma gama de possibilidades maior com o EJBQL
One Day Java 4 41

POJO Entity beans


Ausncia de classes abstratas No requer interfaces
Nem business nem callback interfaces

Suporte para new() Metodos de acesso get/set()


podem conter lgica, como validao (no muda muito pois no se expe mtodos de acesso no comp. intf.)

Uso de Collection para os relacionamentos

One Day Java 4

42

POJO Entity beans (cont.)

Permitir o uso fora de Containers


Tivemos que sacrificar algumas coisas, como CMR Facilitar debugs e testes Uso de beans detached Teste de regras de negcio

One Day Java 4

43

Operaes e ciclos vitais


EntityManager substitui o Home
Usada para criar, remover e alterar entities Factory de queries

Operaes
new() create() remove() Instncias desvinculadas
existem foram do contexto transacional inicial pode ser compartilhada com outras camadas merge() atualiza os dados
One Day Java 4 44

EntityManager

EntityManager muda o foco do modelo


centraliza as operaes em beans remove operaes redundantes de entity beans

One Day Java 4

45

Modelo anterior: Entity beans 2.1


PERSISTNCIA
insert update delete

Entity 2 Entity 1 Entity 3

update insert

delete

Cliente

One Day Java 4

46

Modelo atual: EntityManager


PERSISTNCIA
delete insert update

Entity
Entity 1 Entity 2 Entity 3

Manager
insert update delete

Cliente

One Day Java 4

47

Ciclo vital dos Entity Beans


new()
A instncia ainda no foi inserida

create()
A insero ocorre

remove()
a instncia removida

Instncias detached
Existem fora do contexto transacional em que foram adicionadas ou recuperadas Pode ser transferida para outras camadas merge() consolida as alteraes
One Day Java 4 48

Exemplo: EJB 3.0 Tecnologia O Atual Modelo Entity Bean


@Entity public class Cliente { private Long cod; private String name; private Endereco endereco; private Set pedidos = new HashSet(); @Id(generate=AUTO) public Long getCod(){ return cod; } protected void setCod(Long cod){ this.cod = cod; } ... }
One Day Java 4 49

Exemplo: EJB 3.0 Tecnologia O Atual Modelo Entity Bean (Cont.)


... @OneToMany(cascade=ALL) public Set<Pedido> getPedidos(){ return pedidos; } public void setPedidos(Set<Pedido> pedidos){ this.pedidos = pedidos; } // outros business methods }
One Day Java 4 50

Client View
@Stateless public class CriaPedidosBean{ private EntityManager em; @Inject void setEntityManager(EntityManager em){ this.em = em; } public void adicionarPedido(int cod, Pedido novoPedido){ Cliente c= em.find(Cliente, cod); c.getPedidos().add(novoPedido); novoPedido.setCliente(c); } // outros business methods }
One Day Java 4 51

Mapeamento O/R
O desenvolvedor fica ciente do mapeamento entre o schema do banco de dados e o do bean
Nas queries e nos beans

Equivalncia entre as classes e os dados do banco de dados relacional


Mapeamento explcito O programador tem o controle (ausencia do Deployer)

Pontos de controle
Nas queries Metadata
One Day Java 4 52

Estratgias de Desenvolvimento
Construo e manipulao de um contexto de persistncia
Um conjunto de instncias persistentes que sero manipuladas naquele contexto

Utilizao de queries para recuperar apenas as partes dos registros que interessam
Finder/select queries Projection (projeo) Outer join e prefetch para substituir o CMR

Utilizao de metadata para demarcar as nevagaes (antigo CMR)


One Day Java 4 53

Construo do Contexto de Persistncia


Queries
Acesso mais eficiente aos dados relacionais Melhorias significativas no EJB QL.

Outer Fetch Joins


til para controlar explicitamente a recuperao de dados relacionais Menos viagens ao banco de dados

One Day Java 4

54

Criticas ao modelo atual


O mapeamento O/R feito com metadata
Pr: mapeamento nico para todos os Containers Contra: quebra de encapsulamento, tight-coupling entre as camadas de negcio e de persistncia; requer a aprendizagem de um conjunto complexo de annotations.

Eliminao do Deployment Descriptor


Pr: elimina cdigo redundante Contra: elimina o papel do App. Assembler e a capacidade de mudar comportamentos e configuraes no deploy-time, sem precisar recompilar
One Day Java 4 55

Criticas ao modelo atual (cont.)


Remoo de DTOs
Pr: elimina cdigo redundante Contra: quebra de encapsulamento, tight-coupling entre as camadas de apresentao e de negcios

Herana / Polimorfismo
Pr: aumenta o potencial de modelagem Contra: aumenta a complexidade; trabalhar com composio de objetos fica mais prximo da estrutura de dados relacionais.
One Day Java 4 56

Exemplo: Outer Fetch Join


SELECT c FROM Cliente c LEFT JOIN FETCH c.pedidos WHERE c.pais = Brasil

One Day Java 4

57

Utilizao de Metadata para Potencializar o acesso


Recuperao de Relacionamentos
FetchType
EAGER LAZY (antigo lazy-loading)

Suporte para optimistic locking


@Version @Timestamp

One Day Java 4

58

Mapeando Classes e Tabelas


Utilizao de metadata Suporte para estratgias polimrficas (herana) Tabela/Classe
Hierarquia Tabela/Classe

Outros tipos de mapeamento Tabelas secundrias (SecondaryTables)


Association tables (em relacionamentos many-tomany)

Valores padres para o mapeamento Maior controle e flexibilidade


One Day Java 4 59

Exemplos de Mapeamento O/R utilizando metadata


@Entity @Table(name=CLIENTE) @SecondaryTable(name=CLI_DETALHES) @JoinColumn(name=COD_CLIENTE) //coluna mapeada public class Cliente{ // com a PK ... @Column(name=DESC, nullable=false, length=300) public String getDesc() {return descr;} @OneToMany @JoinColumn(name=COD_CLIENTE, nullable=false) public Collection<Endereco> getEnderecos() { return enderecos; } }
One Day Java 4 60

Exemplo de Mapeamento com Herana


@Entity @Table(name=CLIENTE) @Inheritance(strategy=SINGLE_TABLE, discriminatorType=STRING, discriminatorValue=CLI) public class Cliente {...} @Entity @Inheritance (discriminatorValue=CLI_ESP) public class ClienteEspecial extends Cliente {...}

One Day Java 4

61

O mesmo exemplo utilizando valores padres


@Entity @Table (name=CLI) public class Cliente {...} @Entity @Table (name=CLI_ESP) public class ClienteEspecial extends Cliente {...}

One Day Java 4

62

Melhorias com o EJB QL


Bulk operations (DELETE / UPDATE) Projeo de campos no SELECT Agrupamento (GROUP BY, Having) Subqueries Funes adicionais UPPER, LOWER, TRIM, CURRENT_DATE
Funes de agrupamento: SUM, COUNT

Queries Dinmicas Queries Polimrficas


One Day Java 4 63

Exemplo: Bulk delete/update


DELETE FROM Cliente c WHERE c.status = inativo UPDATE Cliente c SET c.status = ativo WHERE c.codCliente = 1

One Day Java 4

64

Exemplo: Subqueries
//Alunos acima da mdia: SELECT a FROM Aluno a WHERE a.nota > ( SELECT avg(a.nota) FROM Aluno a2) //Funcionrios cujo cnjuge trabalham na mesma empresa SELECT DISTINCT f FROM Funcionario f WHERE EXISTS ( SELECT conj FROM Funcionario conj WHERE conj.nome = f.conjuge)
One Day Java 4 65

Exemplo: Projection
SELECT g.cor, sum(g.peso), count(g) FROM Gato g GROUP BY g.cor HAVING g.cod IN (preto, pardo) SELECT new Animal(r.cor, sum(r.peso), count(r) FROM Rato r GROUP BY r.cor HAVING r.cor IN (branco, malhado)

One Day Java 4

66

Exemplo: API de Query


EntityManager em; ... public List findClientePorNome(String nome){ reutrn em.createQuery( SELECT c FROM Cliente c + WHERE c.nome LIKE :cliNome) .setParameter(cliNome, nome); .setMaxResults(10); .listResults(); }

One Day Java 4

67

Exemplo: Queries Nomeadas


@NamedQuery(name=findClientePorNome, queryString=SELECT c FROM Customer c + WHERE c.nome like :cliNome) @Inject public EntityManager em; List clientes = em.createNamedQuery( findClientesPorNome) .setParameter(cliNome, Ricardo) .listResults();

One Day Java 4

68

A Tecnologia EJB 3.0 E Suas Implicaes na Evoluo do EJB

Viso do Container como um servio intermedirio

Os pontos onde ele interfere so especificados atravs de metadata annotations A funo rgida do Container desaparece

Mudana na viso do componente


As classes que requerem os servios Elas escolhem aqueles que precisam

O Contrato invertido
O Bean no implementa um conjunto de APIs Agora, o Bean que diz o que ele precisa

Arquitetura mais ampla: a viso do Container evolui


One Day Java 4 69

Sumrio e Status Atual


Viso de todos os beans como POJO Apenas POJIs necessrias para session beans Simplificao do acesso ao ambiente Simplificao dos entity beans Mapeamento O/R mais claro
Melhorias no query language

Uso de metadata O rascunho da especificao agora est disponvel


One Day Java 4 70

Mais informaes
Site do java: http://java.sun.com JSR 220 EJB 3.0: http://jcp.org/en/jsr/detail?id=220 JSR 175 Metadata: http://jcp.org/en/jsr/detail?id=175 JUG Petrpolis: http://www.petropolisjug.org Feedback: ejb3-feedback@sun.com
One Day Java 4 71

Perguntas Respostas

&

Tecnologia Enterprise JavaBeans 3.0


Novidades

Luiz Henrique Santanna Barbosa Consultor J2EE


Evento Nacional Java

S-ar putea să vă placă și