JPA 2.0 e Servlet 3.0

Propaganda
JPA 2.0 e Servlet 3.0
Elaine Silva
Instrutora Globalcode
Melissa Villela
Instrutora Globalcode
1
Globalcode – Open4Education
Agenda
>
>
>
>
2
Objetivo
JPA 2.0
Servlet 3.0
Conclusões
Globalcode – Open4Education
Agenda
>
>
>
>
3
Objetivo
JPA 2.0
Servlet 3.0
Conclusões
Globalcode – Open4Education
Objetivo
> Mostrar os principais avanços das APIs de JPA
e Servlet para JavaEE 6
> Obs. Ainda está em fase de definição, então as
coisas podem mudar e a boa notícia é que a
comunidade tem tempo para sugerir alterações
4
Globalcode – Open4Education
Agenda
>
>
>
>
5
Objetivo
JPA 2.0
Servlet 3.0
Conclusões
Globalcode – Open4Education
JPA 2.0
> Java Persistence API
> API para persistência de objetos Java em bases de
dados relacionais usando ORM (Object/Relational
Mapping)
> JPA 1.0 faz parte da especificação EJB 3.0 (JSR 220)
> Especificação concluída em Maio de 2006
> Baseada no uso de POJO, no lugar de EJB Entity
> Pode ser usado em aplicacões construídas com
JavaSE e JavaEE
6
Globalcode – Open4Education
JPA 2.0
> Java Persistence API 2.0
>
>
>
>
>
Especificação iniciada em Julho de 2007
Draft publicado em Junho de 2008
Agora independente de EJB - JSR 317
22 membros no Expert Group
Spec Lider: Linda DeMichiel
> Objetivo Solidificar o padrão de persistência
7
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
8
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
9
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
> Adições de recursos na Java Persistence Query
Language
10
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
> Adições de recursos na Java Persistence Query
Language
> API para Criteria
11
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
> Adições de recursos na Java Persistence Query
Language
> API para Criteria
> Melhor controle sobre entidades detached
12
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
> Adições de recursos na Java Persistence Query
Language
> API para Criteria
> Melhor controle sobre entidades detached
> Suporte para validação
13
Globalcode – Open4Education
JPA 2.0
> Alterações planejadas:
> Maior flexibilidade para a modelagem e expansão
dos recursos de mapeamento de objetos
> Melhoria nas APIs
> Adições de recursos na Java Persistence Query
Language
> API para Criteria
> Melhor controle sobre entidades detached
> Suporte para validação
14
Globalcode – Open4Education
Coleções de tipos básicos
> Anotação para representar coleções de tipos
básicos
> @ElementCollection
> Dados são gravados em uma “tabela da coleção”
> @CollectionTable
> Permite especificar o nome da “tabela de coleção” a ser
utilizada
15
Globalcode – Open4Education
Coleções de tipos básicos
> Na classe Java
@Entity
@Entity
@Table(name=“pessoas”)
@Table(name=“pessoas”)
public
public class
class Pessoa
Pessoa {{
@Id
@Id protected
protected long
long codigo;
codigo;
protected
protected String
String nome;
nome;
protected
protected int
int idade;
idade;
...
...
@ElementCollection
@ElementCollection
@CollectionTable(name=“apelidos”)
@CollectionTable(name=“apelidos”)
@Column(name=“apelido”)
@Column(name=“apelido”)
protected
protected Set<String>
Set<String> apelidos;
apelidos;
...
...
}}
16
Globalcode – Open4Education
Coleções de tipos básicos
> No banco de dados
pessoas
codigo (pk)
nome
idade
17
apelidos
pessoa_codigo (fk)
apelido
Globalcode – Open4Education
Listas ordenadas
> A ordem pode ser persistente ou não
> Ordem não persistente
@Entity
@Entity
public
public class
class Curso
Curso {{
...
...
@ManyToMany
@ManyToMany
@OrderBy(“nome”)
@OrderBy(“nome”)
List<Estudante>
List<Estudante> estudantes;
estudantes;
...
...
}}
18
Globalcode – Open4Education
Listas ordenadas
> Ordem persistente (na classe Java)
@Entity
@Entity
@Table(name=“cursos”)
@Table(name=“cursos”)
public
public class
class Curso
Curso {{
@Id
@Id private
private long
long id;
id;
...
...
@ManyToMany
@ManyToMany
@OrderColumn(name=”posicao_espera”)
@OrderColumn(name=”posicao_espera”)
@JoinTable(name=”espera”
@JoinTable(name=”espera”
joinColumns=@JoinColumn(name=“curso_id”),
joinColumns=@JoinColumn(name=“curso_id”),
inverseJoinColumns=@JoinColumn(name=“estudante_id”))
inverseJoinColumns=@JoinColumn(name=“estudante_id”))
List<Estudante>
List<Estudante> listaEspera;
listaEspera;
...
...
}}
19
Globalcode – Open4Education
Listas ordenadas
> Ordem persistente (no banco de dados)
cursos
estudantes
id (pk)
….
id (pk)
…..
espera
curso_id (fk)
estudante_id (fk)
posicao_espera
20
Globalcode – Open4Education
Classes embeddable
> Classes que não representam entidades
> Dependem de alguma entidade, mas precisam ter
seus dados persistidos
> Suporte está sendo melhorado no JPA 2.0
@Embeddable
@Embeddable
public
public class
class Endereco
Endereco {{
private
private String
String rua;
rua;
private
private int
int numero;
numero;
private
private String
String cidade;
cidade;
private
private String
String uf;
uf;
}}
21
Globalcode – Open4Education
Classes embeddable
> Uso atual de classe embeddable
@Entity
@Entity
@Table(name=“pessoas”)
@Table(name=“pessoas”)
public
public class
class Pessoa
Pessoa {{
@Id
@Id private
private long
long id;
id;
private
private String
String nome;
nome;
@Embedded
@Embedded
private
private Endereco
Endereco endereco;
endereco;
}}
22
pessoas
id (pk)
nome
rua
numero
cidade
uf
Globalcode – Open4Education
Classes embeddable
> Uso de classe embeddable no JPA 2.0
@Entity
@Entity public
public class
class Pessoa
Pessoa {{
@ElementCollection
@ElementCollection
@AttributeOverride(name=”rua”,
@AttributeOverride(name=”rua”,
column=@Column(name=”nome_rua”))
column=@Column(name=”nome_rua”))
protected
protected Set<Endereco>
Set<Endereco> enderecos;
enderecos;
...
...
}}
> Na base de dados
pessoa_enderecos
pessoas
id (pk)
nome
…
23
pessoa_id (fk)
nome_rua
numero
cidade
uf
Globalcode – Open4Education
Configurações de ORM
> OneToMany unidirecional com mapeamento por
chave estrangeira
> Hibernate já suporta esse modelo de mapeamento
> JPA 1.0 suporta apenas tabela de junção
24
Globalcode – Open4Education
Configurações de ORM
> Nas classes Java
@Entity
@Entity
@Table(name=“objetivos”)
@Table(name=“objetivos”)
public
public class
class Objetivo
Objetivo {{
@Id
@Id private
private long
long id;
id;
private
private String
String titulo;
titulo;
private
private String
String texto;
texto;
...
...
}}
25
@Entity
@Entity @Table(name=“cursos”)
@Table(name=“cursos”)
public
public class
class Curso
Curso {{
@Id
@Id private
private long
long id;
id;
private
private String
String nome;
nome;
...
...
@OneToMany
@OneToMany
@JoinColumn(name=“curso_id”)
@JoinColumn(name=“curso_id”)
Set<Objetivo>
Set<Objetivo> objetivos;
objetivos;
}}
Globalcode – Open4Education
Configurações de ORM
> No banco de dados
cursos
id (pk)
nome
….
26
objetivos
id (pk)
titulo
texto
curso_id (fk)
Globalcode – Open4Education
Configurações de ORM
> Exclusão automática de objeto órfão para
relacionamentos oneToOne e oneToMany
@Entity
@Entity
public
public class
class Carrinho
Carrinho {{
@Id
@Id private
private long
long id;
id;
...
...
@OneToMany(cascade=PERSIST,
@OneToMany(cascade=PERSIST, orphanRemoval=true)
orphanRemoval=true)
Set<Item>
Set<Item> items;
items;
}}
27
Globalcode – Open4Education
Melhoria nas APIs
> Interface EntityManager
void clear(Object entity)
Map getProperties()
Set<String> getSupportedProperties()
EntityManagerFactory getEntityManagerFactory()
28
Globalcode – Open4Education
Melhoria nas APIs
> Interface Query
Query setMaxResults(int x)
Map getNamedParameters()
Query setLockMode(LockMode m)
Map getHints()
Set<String>getSupportedHints()
setFirtsResult(int startPosition)
29
Globalcode – Open4Education
Melhoria nas APIs
> Second-level cache
> Recurso de cache para entidades persistentes
> Responsabilidade dos providers de JPA
> Política de cache, habilitação e configuração de cache
> JPA 2.0: API para funcionalidades básicas de Cache
boolean contains(Class c, Object primaryKey)
void evict(Class c, Object primaryKey)
void evict(Class c)
void evictAll()
30
Globalcode – Open4Education
Em aberto
> Características em discussão
>
>
>
>
Java Persistence Query Language
API Criteria
Melhor controle sobre entidades detached
Suporte à validação
> JSR 303 – Bean Validation
31
Globalcode – Open4Education
Agenda
>
>
>
>
32
Objetivo
JPA 2.0
Servlet 3.0
Conclusões
Globalcode – Open4Education
Servlet 3.0
> Java Servlet 3.0 API – JSR 315
> Especificação iniciada em Junho de 2007
> Cerca de 20 especialistas, entre eles desenvolvedores
de containers web e autores de frameworks.
> Spec Lider: Rajiv Mordani
> Principais objetivos desta JSR:
>
>
>
>
33
Pluggability
Facilitar o desenvolvimento
Suporte a Servlet assíncrono
Melhorias nos aspectos de segurança
Globalcode – Open4Education
Pluggability
> Cenário atual ao usar um framework muitas
vezes é necessário fazer adaptações no
web.xml:
> Definir servlets
> Definir filtros
> Definir listeners
> Estas adaptações podem tornar complexo a
manutenção do web.xml
34
Globalcode – Open4Education
Pluggability
> O ideal é que cada framework já tenha suas
configurações definidas
> No novo cenário JavaEE 6:
> Possibilidade de utilização de frameworks e
bibliotecas sem configurações adicionais
> Modularização do web.xml
35
Globalcode – Open4Education
Pluggability
> Modularização do web.xml
> Cada framework poderá definir seu próprio
web.xml e inclui-lo no diretório META-INF do
arquivo jar
> O Container será responsável por descobrir os
fragmentos que estão dentro dos jars vinculados
a aplicação
> Criação de um novo elemento no web.xml webfragment que contém os sub-elementos servlets,
filters and listeners
36
Globalcode – Open4Education
Pluggability
> Modelo de fragmento do web.xml
<web-fragment>
<web-fragment>
<servlet>
<servlet>
<servlet-name>welcome</servlet<servlet-name>welcome</servletname>
name>
<servlet-class>
<servlet-class>
WelcomeServlet
WelcomeServlet
</servlet-class>
</servlet-class>
</servlet>
</servlet>
<servlet-mapping>
<servlet-mapping>
<servlet-name>welcome</servlet<servlet-name>welcome</servletname>
name>
<url-pattern>/Welcome</url<url-pattern>/Welcome</urlpattern>
pattern>
</servlet-mapping>
</servlet-mapping>
</web-fragment>
</web-fragment>
37
Globalcode – Open4Education
Facilitar o desenvolvimento
> Permitir que as APIs de Servlet utilizem os
novos recursos da linguagem
> Uso de anotações
> Uso de generics, para diminuir os erros de
runtime
> Arquivo web.xml opcional
38
Globalcode – Open4Education
Facilitar o desenvolvimento
> Definição de um servlet utilizando a anotação
@Servlet
> Precisa especificar o url-mapping
> As demais tags são opcionais, por exemplo o nome
completamente qualificado da classe
> Qualquer método poderá ser usado com as
anotações @GET, @PUT, @POST, @DELETE,
@HEAD
> O web.xml pode ser utilizado para sobrescrever
valores anotados
39
Globalcode – Open4Education
Facilitar o desenvolvimento
> Atualmente
Classe Java
package
package br.com.globalcode.servlets;
br.com.globalcode.servlets;
import
import ……
public
public class
class ServletTradicional
ServletTradicional extends
extends
HttpServlet
HttpServlet {{
protected
protected void
void doGet(HttpServletRequest
doGet(HttpServletRequest
request,
request, HttpServletResponse
HttpServletResponse response){...}
response){...}
}}
<servlet>
<servlet>
<servlet-name>ServletTradicional</servlet-name>
<servlet-name>ServletTradicional</servlet-name>
<servlet-class>
<servlet-class>
br.com.globalcode.servlets.ServletTradicional
br.com.globalcode.servlets.ServletTradicional
</servlet-class>
</servlet-class>
</servlet>
</servlet>
<servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTradicional</servlet-name>
<servlet-name>ServletTradicional</servlet-name>
<url-pattern>/ServletTradicional</url-pattern>
<url-pattern>/ServletTradicional</url-pattern>
</servlet-mapping>
</servlet-mapping>
40
web.xml
Globalcode – Open4Education
Facilitar o desenvolvimento
> Futuro
Classe Java
package
package br.com.globalcode.servlets;
br.com.globalcode.servlets;
import
import ……
@Servlet(urlMapping={“/ServletTradicional”})
@Servlet(urlMapping={“/ServletTradicional”})
public
public class
class ServletTradicional
ServletTradicional {{
@GET
@GET
public
public void
void qualquerMetodo(
qualquerMetodo(
HttpServletRequest
HttpServletRequest request,
request,
HttpServletResponse
HttpServletResponse response)
response) {{
...
...
}}
}}
41
Globalcode – Open4Education
Facilitar o desenvolvimento
> Atualmente
package
package br.com.globalcode.filters;
br.com.globalcode.filters;
import
import ...
...
public
public class
class FiltroParaLog
FiltroParaLog implements
implements Filter
Filter {{
public
public void
void doFilter(ServletRequest
doFilter(ServletRequest request,
request,
ServletResponse
ServletResponse response,
response, FilterChain
FilterChain chain)
chain)
{{ ...
... }}
//
// outros
outros métodos
métodos do
do filtro
filtro
}}
Classe Java
<filter>
<filter>
<filter-name>FiltroParaLog</filter-name>
<filter-name>FiltroParaLog</filter-name>
<filter-class>
<filter-class>
br.com.globalcode.filters.FiltroParaLog
br.com.globalcode.filters.FiltroParaLog
</filter-class>
</filter-class>
</filter>
</filter>
<filter-mapping>
<filter-mapping>
<filter-name>FiltroParaLog</filter-name>
<filter-name>FiltroParaLog</filter-name>
<url-pattern>/FiltroParaLog</url-pattern>
<url-pattern>/FiltroParaLog</url-pattern>
</filter-mapping>
</filter-mapping>
42
web.xml
Globalcode – Open4Education
Facilitar o desenvolvimento
> Futuro
Classe Java
package
package br.com.globalcode.filters;
br.com.globalcode.filters;
import
import ...
...
@ServletFilter
@ServletFilter
@FilterMapping(urlPattern=“/FiltroParaLog”)
@FilterMapping(urlPattern=“/FiltroParaLog”)
public
public class
class FiltroParaLog
FiltroParaLog {{
public
public void
void doFilter(
doFilter(
HTTPServletRequest
HTTPServletRequest request,
request,
HTTPServletResponse
HTTPServletResponse response){
response){ ...
... }}
}}
43
Globalcode – Open4Education
Facilitar o desenvolvimento
> Atualmente
package
package br.com.globalcode.listeners;
br.com.globalcode.listeners;
import
import ...
...
public
public class
class ListenerDeContexto
ListenerDeContexto implements
implements
ServletContextListener
ServletContextListener {{
public
public void
void contextInitialized(
contextInitialized(
ServletContextEvent
ServletContextEvent e)
e) {{ ...
... }}
//
// outros
outros métodos
métodos do
do listener
listener
}}
Classe Java
web.xml
<listener>
<listener>
<listener-class>
<listener-class>
br.com.globalcode.listeners.ListenerDeContexto
br.com.globalcode.listeners.ListenerDeContexto
</listener-class>
</listener-class>
</listener>
</listener>
44
Globalcode – Open4Education
Facilitar o desenvolvimento
> Futuro
package
package br.com.globalcode.listeners;
br.com.globalcode.listeners;
import
import ...
...
@ServletContextListener
@ServletContextListener
public
public class
class ListenerDeContexto
ListenerDeContexto {{
public
public void
void contextInitialized(
contextInitialized(
ServletContextEvent
ServletContextEvent e)
e) {{ ...
... }}
//
// outros
outros métodos
métodos do
do listener
listener
}}
Classe Java
45
Globalcode – Open4Education
Suporte a Servlet assíncrono
> Adição de novas APIs para habilitar o
desenvolvimento com o estilo de programação
Comet
> Contar com uma conexão persistente entre o
servidor e o cliente
> Streaming – o browser abre uma conexão persistente
como servidor, e este browser será responsável por
interpretar os eventos Comet recebidos do servidor
> Long polling - é aberto uma nova requisição a cada
evento (ou a cada conjunto de eventos)
46
Globalcode – Open4Education
Suporte a Servlet assíncrono
> Inclusão de novos métodos em ServletRequest
para que as requisições sejam suspensas,
renovadas ou tenham um timed-out pré-definido
> Criação de ServletRequestListener
47
Globalcode – Open4Education
Segurança
> Ainda em discussão pelo expert group
> Adição de métodos para fazer login e logout em
> HTTPServletRequest
> HTTPServletRequestWrapper
> HTTPSession (logout)
48
Globalcode – Open4Education
Em aberto
> Características ainda em discussão
>
>
>
>
49
File upload
Parâmetros de inicialização para o container
Definição final dos itens vistos
Solicitações do JSF 2.0
Globalcode – Open4Education
Agenda
>
>
>
>
50
Objetivo
JPA 2.0
Servlet 3.0
Conclusões
Globalcode – Open4Education
Conclusão: JPA 2.0
> Documento atual “Early Draft Review”
> Flexibilidade da modelagem, melhoria no
mapeamento ORM e nas APIs
> Próxima revisão deve ser focada na JPA Query
Language
> Contribuições são bem-vindas
> [email protected]
> Implementação de referência
> EclipseLink
> Será disponibilizada juntamente com o projeto
GlassFish V3
51
Globalcode – Open4Education
Conclusão: Servlet 3.0
> Documento atual “Early Draft Review”
>
>
>
>
>
Pluggability para os frameworks
Facilidade no desenvolvimento
Suporte ao estilo de programação Comet
Melhorias nos aspectos de segurança (login e logout)
Contribuições são bem-vindas
> [email protected]
> Implementação de referência
> Será disponibilizada juntamente com o projeto
GlassFish V3
52
Globalcode – Open4Education
Perguntas?
JPA 2.0 e Servlet 3.0
53
Globalcode – Open4Education
Download