Vous êtes sur la page 1sur 45

JSP/Servlets

10.1

Sistemas de Informao Web : JSP/Servlets


Aula 01: XHTML Aula 02: Aplicativos Web, Introduo JSP/Servlets/Formulrios
Sistemas de Informao Web

Aula 03: Sintaxe, Ambiente de programao JSP, Interao com Formulrios. Aula 04: Componentes JSP Javabeans Aula 05: Controle de Usurios com Cookies e Sesses e Controle de Erros Aula 06: Acesso a banco de dados Aula 07: Servlets Aula 08: Estudo de Caso Um Sistema de Gerenciamento de FAQs Aula 09: Linguagem de Expresso 2.0 e JSP-Standard Tag Library (JSTL). Aula 10: Java Persistence API. Aula 11: Struts - Princpio de Funcionamento. Aula 12: Struts - Exemplo de Aplicao. Aulas 13/14/15: Projeto
JSP/Servlets

10.2

Java Persistence API - JPA


Esta aula fortemente baseada nas transparncias sobre JPA (Java Persistence API: Simplifying Persistence) produzidas por Sang Shin em seu site Java Passion e disponibilizadas em http://www.javapassion.com/j2ee/#jpa1
Sistemas de Informao Web

Dos seguintes artigos obteve-se tambm material tcnico de descrio sobre a JPA:
The Java Persistence API - A Simpler Programming Model for Entity Persistence: http://java.sun.com/developer/technicalArticles/J2EE/jpa/ An Introduction to Java Persistence for Client-Side Developers: http://today.java.net/pub/a/today/2006/05/23/ejb3-persistence-api-for-client-sidedeveloper.html Java Persistence APIs: https://blueprints.dev.java.net/bpcatalog/ee5/persistence/index.html Standardizing Java Persistence with the EJB3 Java Persistence API: http://www.onjava.com/pub/a/onjava/2006/05/17/standardizing-with-ejb3-javapersistence-api.html?page=1

JSP/Servlets

10.3

JPA - Criao
A partir das novas caractersticas disponibilizadas no Java SE 5 definiram-se as novas especificaes do Java Enterprise Edition Enterprise Java Beans 3 (EJB3) que introduziram um novo modo de comunicao com Banco de Dados denominado Java Persistence API (JPA). EJB3 foi inicialmente projetada para uso com aplicaes cliente-servidor de grande porte mas facilmente utilizvel, para de maneira simples, carregar, salvar e buscar por objetos em aplicaes simples Com JPA pode-se realizar toda a interao com um BD sem conhecimento de SQL, JDBC ou outra tecnologia de Banco de Dados. A JPA uma especificao baseada em Plain Old Java Objects (POJOs) que foi construda a partir de idias chaves de diferentes frameworks e APIs de persistncia existentes como, Hibernate, Oracle TopLink, e Java Data Objects (JDO) e tambm considerando a verso 2.1 de EJB A especificao Enterprise JavaBeans 3.0 Specification (JSR 220) pode ser obtida em http://jcp.org/en/jsr/detail?id=220.

Sistemas de Informao Web

JSP/Servlets

10.4

JPA - Caractersticas
Permite que se configure a maior parte das especificaes de uma aplicao que use um Banco de Dados atravs de anotaes padro. Necessita que se utilize poucas classes e interfaces. Elimina virtualmente a necessidade de utilizao do Descritor da Implantao J2EE (Deployment Descriptor) atravs da utilizao de anotaes. Oferece um mapeamento objeto-relacional que claro e fcil de ser implementado. Adiciona suporte para herana, polimorfismo e consultas polimrficas. Adiciona suporte para consultas nomeadas (estticas) e dinmicas. Oferece uma linguagem de consulta denominada Java Persistence Query Language que um aprimoramento da EJB QL . Torna fcil o teste de entidades fora de um continer EJB. Pode ser utilizada fora de um continer EJB. Pode ser utilizada com diferentes fornecedores de persistncia oferecidos pelo mercado (Ex.: Hibernate, TopLink, etc.).

Sistemas de Informao Web

JSP/Servlets

10.5

JPA - Resumo
Modelo declarativo que permite atravs da utilizao de anotaes que se descreva mapeamentos O/R.
Sistemas de Informao Web

Existncia de uma linguagem de consulta prpria. Existncia de um conjunto de ferramentas que permite que se manipule entidades. Possibilidade de escolha entre implementaes de diferentes fabricantes (desde que em conformidade com a JSR-220) Aplicao pode funcionar com diferentes implementaes de JPA:
Oracle Top-Link: http://www.oracle.com/technology/products/ias/toplink/jpa/index.html Hibernate: http://www.hibernate.org/397.html

JSP/Servlets

10.6

JPA - Utilizao
Aplicao Java
Sistemas de Informao Web

Hibernate TopLink Kodo OpenJPA Etc.

Java Persistence API Provedor JPA API JDBC Driver JDBC


MySQL PostgreSQL JavaDB Oracle DB2 Etc.

SGBDR

Renato Bellia, Uma Aplicao Java EE Completa, Java Magazine, n 44, Ano V, pgs. 27, 36.

JSP/Servlets JPA

10.7

Entidades
Com JPA entidades so descritas como POJOs sendo criadas atravs da palavra chave Java new No necessitam que se defina interfaces
Sistemas de Informao Web

Tm uma identidade persistente Podem ter estados persistentes e no persistentes Podem utilizar tipos simples (primitivos, wrappers, enums) Podem usar objetos como tipos (ex.: Endereo) Podem estar em um estado no persistente (transiente - @Transient) Podem herdar de outras entidades ou classes (no entidade) do sistema So serializveis podendo ser utilizadas como objetos desacoplados (detached) em outras camadas da aplicao No necessrio que se utilize DTOs (Data Transfer Objects)

JSP/Servlets JPA

10.8

Entidade - Exemplo
@Entity public class Customer implements Serializable { @Id protected Long id; protected String name; @Embedded protected Address address; protected PreferredStatus status; @Transient protected int orderCount; public Customer() {} public Long getId() {return id;} protected void setId(Long id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;} }
Sang Shin

Sistemas de Informao Web

JSP/Servlets JPA

10.9

Entidade - Identificador
Cada Entidade tem um identificador de persistncia primria no banco de dados. O identificador pode corresponder a um tipo simples:
Sistemas de Informao Web

Mapeamento para a chave

@Id: campo simples/propriedade na classe entidade @GeneratedValue: valor que pode ser gerado automaticamente usando diferentes estratgias - SEQUENCE, TABLE, IDENTITY, AUTO

Pode corresponder a uma classe definida pelo usurio


@EmbeddedId: campo simples/propriedade na classe entidade @IdClass: corresponde a mltiplos campos Id na classe entidade

Deve ser definido na raiz da hierarquia da entidade ou da super-classe mapeada A documentao completa para as anotaes pode ser obtida em http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html ou alternativamente em http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html
Sang Shin

JSP/Servlets JPA

10.10

Modelo de Programao na JPA


Cada Entidade um POJO (no necessrio implementar um EntityBean) Utiliza-se Anotaes para indicar que o POJO uma Entidade (no se utiliza um deployment descriptor)
Sistemas de Informao Web

// @Entity uma anotao // Ela anota o POJO Employee transformando-se em Entidade @Entity public class Employee { // Campos Persistentes/Transientes // Getters e Setters // Mtodos com a lgica de persistncia }

Sang Shin

JSP/Servlets JPA

10.11

Entidade Persistente - Exemplo


Anotada como Entity

Sistemas de Informao Web

@Entity public class Customer { private Long id; private String name; private Address address; private Collection<Order> orders = new HashSet(); public Customer() {} @Id public Long getID() { return id; } protected void setID (Long id) { this.id = id; } Getters/setters para acessar o estado M
@Id indica a chave primria

Sang Shin

JSP/Servlets JPA

10.12

Entidade Persistente Exemplo Cont.


M
Sistemas de Informao Web

// Relacionamento entre Customer e Orders @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Collection<Order> orders) { this.orders = orders; } // Outros mtodos de negcio ... }

Sang Shin

JSP/Servlets JPA

10.13

Cdigo Cliente
public static void main(String[] args) { EntityManagerFactory emf = Persistence. createEntityManagerFactory("EmployeeService"); EntityManager em = emf.createEntityManager(); Collection emps = em.createQuery("SELECT c FROM Customer c") .getResultList(); // Continuao do cdigo

Sistemas de Informao Web

Sang Shin

JSP/Servlets JPA

10.14

Contexto de Persistncia e Gerenciador de Entidades


Para que uma entidade se torne persistente necessrio que ela esteja associada a um Contexto de Persistncia (Persistent Context) que ir fornecer a conexo entre as instncias e o Banco de Dados:
Representa em tempo de execuo um conjunto de instncia gerenciadas (managed) Instncia de Entidade em estado gerenciado indica que ela est contida em um contexto persistente A incluso ou excluso de uma entidade no/do contexto de persistncia ir determinar o resultado de toda a operao de persistncia sobre ela O Contexto de Persistncia no acessvel diretamente na aplicao Ele acessado indiretamente atravs do Gerenciador de Entidades o tipo de gerenciador de entidades determina como o contexto de persistncia criado e removido

Sistemas de Informao Web

A manipulao das entidades feita, a partir do contexto, utilizando um EntityManager Gerenciador de Entidade:
Executa as operaes bsicas do ciclo de vida das entidades Gerencia o contexto de Persistncia Gerenciador de entidade uma instncia da interface javax.persistence.EntityManager.
Sang Shin

JSP/Servlets

10.15

Provedor de Persistncia
Implementao da JPA feita por um Provedor de Persistncia (Persistence Provider) que define, considerando sua implementao das interfaces definidas na especificao
Sistemas de Informao Web

da JPA, como as coisas funcionam. Cada provedor (Hibernate, Oracle TopLink) decide o momento e como carregar, atualizar e armazenar as entidades e tambm como ser feita a sincronizao de dados com o banco de dados. As configuraes (conexo com o banco, entidades mantidas, tipo de transao, etc.) que so utilizadas pelo provedor em uma aplicao so descritas atravs de uma Unidade de Persistncia (Persistence Unit) que configurada em um arquivo especfico denominado persistence.xml.

Sang Shin

JSP/Servlets

Gerenciador de Entidades - EntityManager


Similar em funcionalidade s Sesses do Hibernate, ou do JDO PersistenceManager, etc.
Sistemas de Informao Web

Pode ser de dois tipos: Controlado por um Servidor Container-Managed Entity Manager (Ex.: Sun Server, JBoss, etc.) ou pela prpria aplicao ApplicationManaged Entity Manager. Controla o ciclo de vida das entidades
persist(): insere uma entidade no BD remove(): remove uma entidade no BD merge(): sincroniza o estado de entidades descoladas (detached) refresh(): recarrega o estado do BD

Exemplo de operaes:

Sang Shin

JSP/Servlets

10.17

Estados de uma Entidade


[D] [A] [B] DETACHED Sistemas de Informao Web NEW [C] [F] [G] MANAGED [E] [G]

A: operao new normal de uma classe Java G: coletor de lixo B: find(classe, identificador) C: persist(objeto)

REMOVED

D: clear() limpa o contexto de persistncia, ocorrendo tambm quando o objeto serializado ou quando o EntityManager fechado. E: merge(objeto) Copia os atributos do objeto DETACHED para um objeto MANAGED e retorna este objeto MANAGED F: remove(objeto)

Renato Bellia, Uma Aplicao Java EE Completa, Java Magazine, n 44, Ano V, pgs. 27, 36.

JSP/Servlets

10.18

JPA - Elementos
Persistence
Sistemas de Informao Web 1

cria >
n

Persistence Unit

< configurado por


1 1

EntityManagerFactory
1

cria >
n

Persistence Context

< gerencia
1 n

EntityManager

http://www.oracle.com/technology/products/ias/toplink/jpa/resources/ Pro_EJB_3-Java_Persistence_API-Chapter2.pdf

JSP/Servlets

Operao Persist
public Order createNewOrder(Customer customer) { Order order = new Order(customer);
Sistemas de Informao Web

// Mudana da nova instncia para o estado managed. // Na prxima operao flush ou commit, a instncia // recentemente persistida ser inserida no banco de dados. entityManager.persist(order); return order; }

Sang Shin

JSP/Servlets

Operaes Find e Remove


public void removeOrder(Long orderId) { Order order = entityManager.find(Order.class, orderId);
Sistemas de Informao Web

// A instncia ser suprimida da base de dados // na prxima operao flush ou commit. O acesso a // entidades removidas tem resultados indefinidos. entityManager.remove(order); }

Sang Shin

JSP/Servlets

Operao Merge
public OrderLine updateOrderLine(OrderLine orderLine) { // O mtodo merge retorna uma cpia managed de uma // entidade detached. Alteraes feitas no // estado persistente da entidade detached sero // aplicados a instncia managed. return entityManager.merge(orderLine); }

Sistemas de Informao Web

Sang Shin

JSP/Servlets

Transaes e Contexto de Persistncia


As transaes definem quando entidades novas, modificadas, ou removidas so sincronizadas com o banco de dados Existem dois diferentes tipos de transaes: Transaes com recursos-locais e Transaes JTA
Sistemas de Informao Web

(Java Transaction API) O tipo da transao definido na unidade de persistncia (arquivo persistence.xml) Utiliza-se JTA por padro em um continer (aplicao JEE) e RESOURCE_LOCAL em ambientes JSE O Gerenciador de Entidades controlado por um continer utiliza transaes JTA Propagao do contexto de persistncia com uma transao JTA suportada pelo continer atravs do compartilhamento do mesmo contexto de persistncia entre diferentes gerenciadores de entidades A maneira pela qual o contexto de persistncia criado e utilizado determinado pelo tipo de transao (Resource-Local ou JTA) e pelo atributo Transaction (REQUIRED, ..) Anotaes @TransactionAttribute: TransactionAttributeType.REQUIRED, .REQUIRES_NEW, .MANDATORY, .NOT_SUPPORTED,.NEVER,.SUPPORTS
Sang Shin

JSP/Servlets

Entidades Desacopladas (Detached)


Devem implementar a interface Serializable se o objeto desacoplado necessitar ser reutilizado
Sistemas de Informao Web

No necessrio se utilizar DTO (Data Transfer Object)

Unio de objetos desacoplados pode ser cascateada Alterao do estado para Objeto Desacoplado: Quando uma transao committed ou rollback'ed Quando uma entidade serializada

Sang Shin

JSP/Servlets

Mapeamento O/R
Conjunto compreensivo de anotaes so utilizadas para o mapeamento O/R
Relacionamentos Junes Tabelas e colunas de bancos de dados Geradores de seqncia de bancos de dados Muito mais...

Sistemas de Informao Web

Utilizao especfica
Anotaes como parte do cdigo das classes Arquivos de mapeamento separados

Sang Shin

JSP/Servlets

Mapeamento Simples
CUSTOMER
ID NAME CREDIT PHOTO

Sistemas de Informao Web

@Entity(access=FIELD) public class Customer { @Id int id; String name; @Column(name=CREDIT) int c_rating; @Lob Image photo; }

Sang Shin

JSP/Servlets

Exemplo: Mapeamento O/R


@Entity @Table(name="EMPLOYEE", schema="EMPLOYEE_SCHEMA") uniqueConstraints= {@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})} public class EMPLOYEE { ... @Column(name="NAME", nullable=false, length=30) public String getName() { return name; } }

Sistemas de Informao Web

Sang Shin

JSP/Servlets

Relacionamentos de Entidades
Modela associaes entre entidades Suporta relacionamento unidirecionais (entidade A referencia entidade B, mas B no referencia A) e bidirecionais
Sistemas de Informao Web

Cardinalidades
Um pra um (One to one) Um pra muitos (One to many) Muitos pra um (Many to one) Muitos pra muitos (Many to many)

Sang Shin

JSP/Servlets

Exemplo: Relacionamentos de Entidades


@Entity public class Project {
Sistemas de Informao Web

Muitos para Muitos

private Collection<Employee> employees; @ManyToMany public Collection<Employee> getEmployees() { return employees; } public void setEmployees(Collection<Employee> employees) { this.employees = employees; } ... }
Sang Shin

JSP/Servlets

Comportamento em Cascata
O comportamento em cascata pode ser usado para propagar o efeito das operaes para as entidades associadas
Sistemas de Informao Web

Cascade=PERSIST Cascade=REMOVE Cascade=MERGE Cascade=REFRESH Cascade=ALL

Sang Shin

JSP/Servlets

Herana de Entidades
Entidades podem apresentar relacionamentos de herana pois so POJO Para o mapeamento da herana (mapeamento das entidades para tabelas do banco de dados) se pode utilizar trs estratgias
Tabela nica por Hierarquia de Classe Tabela por Classe Concreta Tabela por Subclasse

Sistemas de Informao Web

Utilizao da notao @Inheritance(..)

Sang Shin

JSP/Servlets

Estratgia de Tabela nica por Hierarquia


Todas as classes na hierarquia so mapeadas para uma nica tabela Anotao para a Entidade pai @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
Sistemas de Informao Web

A tabela raiz tem uma coluna que funciona como discriminador O valor desta coluna identifica a subclasse especfica qual a instncia representada pela linha pertence: @DiscriminatorColumn(columnDefinition="MYDTYPE") Vantagens: Mais simples de implementar Melhor desempenho entre as 3 estratgias Desvantagens: Todas as propriedades da tabela precisam ser anulveis Propriedades no utilizadas Tabela no normalizada

Sang Shin

JSP/Servlets

Exemplo: Tabela nica por Hierarquia


// Parent Entity @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(columnDefinition="MYDTYPE") public class Person implements Serializable {...} // Child Entity @Entity public class Student extends Person {...} // Child Entity @Entity @DiscriminatorValue("PROFESSOR") public class Teacher extends Person {...}
Sang Shin

Sistemas de Informao Web

JSP/Servlets

Estratgia de Tabela por Classe Concreta


Cada classe concreta mapeada para uma tabela diferente com suas propriedades e de quaisquer de suas superclasses
Sistemas de Informao Web

Cada tabela tem colunas

Anotao para a Entidade pai @Inheritance(strategy=InheritanceType.TABLE_PER_ CLASS) Nenhuma coluna discriminadora necessria no esquema do banco de dados Vantagens: Pode-se definir restries nas propriedades das subclasses Esquema legado pode ser mapeado mais facilmente Desvantagens: Colunas redundantes Tabelas no normalizadas Gerenciador de persistncia tem que realizar operaes que consomem muitos recursos

JSP/Servlets

Exemplo: Tabela por Classe Concreta


// Parent Entity @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class Person implements Serializable {...} // Child Entity @Entity public class Student extends Person {...} // Child Entity @Entity public class Teacher extends Person {...}

Sistemas de Informao Web

JSP/Servlets

Estratgia de Tabela por Subclasse


Cada subclasse mapeada para uma tabela diferente, e esta tabela contm somente as propriedades definidas na subclasse especfica Semelhante a estratgia TABLE_PER_CLASSE mas com esquema normalizado
Sistemas de Informao Web

Anotao para a Entidade pai @Inheritance(strategy=InheritanceType.JOINED) Cada tabela deve ter uma coluna que possa ser utilizada para unir as tabelas Se a propriedade em uma tabela tiver um nome diferente, pode-se usar uma notao para indicar que trata-se da coluna de unio: @PrimaryKeyJoinColumn(name="ID_Tabela")

Sang Shin

JSP/Servlets

Exemplo: Tabela por Subclasse


// Parent Entity @Entity @Inheritance(strategy=InheritanceType.JOINED) public class Person implements Serializable {...} // Child Entity @Entity public class Student extends Person {...} // Child Entity @Entity @PrimaryKeyJoinColumn(name="PK_TEACHER") public class Teacher extends Person {...}

Sistemas de Informao Web

Sang Shin

JSP/Servlets

Objetos Embutidos (Embedded )


A notao @Embeddable utilizada para marcar um objeto embutido Um objeto embutido armazenado como uma parte intrnseca da entidade que o
Sistemas de Informao Web

contm, no tendo portanto uma identidade prpria Cada campo/propriedade persistente de um objeto embutido mapeado para a mesma tabela do banco de dados que representa a entidade que o contm

Sang Shin

JSP/Servlets

Embedded Objects
@Entity public class Customer { @Id int id; @Embedded CustomerInfo info; }

Sistemas de Informao Web

CUSTOMER
ID NAME CREDIT PHOTO

@Embeddable public class CustomerInfo { String name; int credit; @Lob Image photo; }
Sang Shin

JSP/Servlets

Chaves Primrias Compostas


Pode-se ter uma Entidade que tenha um identificador que seja composto de diversos campos
Sistemas de Informao Web

A chave primria da tabela composta de mltiplas colunas

Pode-se

utilizar uma classe para definir a chave primria

Classe de Chave Primria

A classe de chave primria deve ser Serializable e pode ser de dois tipos
Classe embutida anotada com @Embeddable Classe independente com identificador de classe anotado com @IdClass

Sang Shin

JSP/Servlets

Exemplo: @Embeddable e @EmbeddedId


@Entity public class Employee { // O EmployeeId do tipo @Embeddable @EmbeddedId private EmployeeId id; private String name; private long salary; // restante do cdigo

Sistemas de Informao Web Sang Shin

JSP/Servlets

Melhorias EJB-QL
Suporte para consultas dinmicas em adio a consultas estticas e nomeadas Consultas polimrficas Operaes de atualizao (update) e supresso (delete) melhoradas
Sistemas de Informao Web

Junes Group By / Having Sub-consultas Funes SQL adicionais: UPPER, LOWER, TRIM, CURRENT_DATE, ...

Sang Shin

JSP/Servlets

Consultas
Consultas Estticas: definidas em linguagem Java com metadados ou XML Anotaes:
Sistemas de Informao Web

@NamedQuery @NamedNativeQuery

Consultas Dinmicas: consulta definida em tempo de execuo


Utiliza linguagem de consulta Java Persistence ou SQL Parmetros nomeados ou posicionais Gerenciador de Entidades (EntityManager) a fbrica dos objetos de consulta: createNamedQuery, createQuery, createNativeQuery Mtodos da consulta para controlar o nmero mximo de resultados, paginao, etc.
Sang Shin

JSP/Servlets

Consultas Dinmicas
// Constri e executa consultas dinamicamente em tempo de // execuo.
Sistemas de Informao Web

public List findWithName (String name) { return em.CreateQuery ( "SELECT c FROM Customer c " + "WHERE c.name LIKE :custName") .setParameter("custName", name) .setMaxResults(10) .getResultList(); }

Sang Shin

JSP/Servlets

Consultas Estticas
@NamedQuery(name="customerFindByZipcode", query = "SELECT c FROM Customer c WHERE c.address. zipcode = :zip") @Entity public class Customer {}

Sistemas de Informao Web

public List findCustomerByZipcode(int zipcode) { return em.createNamedQuery ("customerFindByZipcode") .setParameter("zip", zipcode) .setMaxResults(20) .getResultList(); }

Sang Shin

JSP/Servlets

Consultas Polimrficas
Todas as consultas so, por padro, polimrficas todas as subclasses desta entidade
Sistemas de Informao Web

As clusulas FROM de uma

consulta designam no somente instncias de uma entidade especfica mas tambm Ex.:
select avg(e.salary) from Employee e where e.salary > 80000

Este exemplo retorna a mdia de salrio de todos os empregados, incluindo subtipos de empregado, como por exemplo gerente.

Sang Shin

JSP/Servlets

Sub-consultas
SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ( SELECT mgr FROM Manager mgr WHERE emp.manager = mgr AND emp.salary > mgr.salary)

Sistemas de Informao Web

Sang Shin

JSP/Servlets

Junes
Deve-se adicionar a palavra chave JOIN a EJB-QL Existe suporte para
Sistemas de Informao Web

Inner Joins Left Joins/Left outer joins Fetch join: Habilita a pr-busca de dados de associaes como um efeito secundrio da consulta SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.orders WHERE c.address.state = 'MA'

Sang Shin

JSP/Servlets

Projeo
SELECT e.name, d.name FROM Employee e JOIN e.department d
Sistemas de Informao Web

WHERE e.status = FULLTIME SELECT new com.example.EmployeeInfo(e.id, e.name, e.salary, e.status, d.name) FROM Employee e JOIN e.department d WHERE e.address.state = CA

Sang Shin

JSP/Servlets

Update, Delete
UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.department.name = Engineering
Sistemas de Informao Web

DELETE FROM Customer c WHERE c.status = inactive AND c.orders IS EMPTY AND c.balance = 0

Sang Shin

JSP/ServletsAs Classes do Sistema

10.50

O Exemplo
O exemplo apresentado foi retirado do artigo publicado por Andr Dantas Rocha e Srgio Oliveira Kubota, na Java Magazine de n 39 e intitulado Persistncia no Java EE 5.
Sistemas de Informao Web

Utiliza-se a implementao Top Link Essentials que uma verso Open Source da ferramenta de mapeamento objeto relacional da Oracle denominada Top Link Implementao utilizada no projeto GlassFish que a Implementao de Referncia do Java EE 5.0 No exemplo no se utiliza um continer EJB. O sistema analisado apresenta funcionalidades bsicas de uma aplicao bastante simplificada de uma agncia de locao de veculos. Para executar o exemplo necessrio copiar para o diretrio WEB-INF/lib os arquivos jar do TopLink (toplink-essentials.jar), do Log4J (log4j-1.2.11.jar) e do PostgreSQL (postgresql-8.1-405.jdbc3.jar)
Criar um novo projeto denominado Aula10 para utilizao com o exemplo

JSP/Servlets JPA

10.51

Diagrama de Classes
Veiculo codigo : Integer placa : String modelo : String ano : Integer cor : String diaria : Double Reserva codigo : String inicio : Date fim : Date 1 Cliente codigo : String nome : String endereco : String

Sistemas de Informao Web

+reservas 1

+veiculo n

+cliente +reservas n 1

1 Esportivo velocidade : Integer Utilitario passageiros : Integer

+reserva

Locacao codigo : Integer

JSP/ServletsAs Classes do Sistema

10.52

O Modelo ER

Sistemas de Informao Web

JSP/ServletsAs Classes do Sistema

10.53

A Classe Cliente.java
Cliente.java package persistence; import java.util.List; import javax.persistence.*; Consulta nomeada. Define-se o identificador da identidade (a chave primria da tabelas) e o nome do atributo na tabela pois diferente do nome do atributo na entidade. Define-se tambm a modo como a chave primria ser gerada, neste caso usando um valor controlado pelo SGBD (serial para o PostgreSQL)

Sistemas de Informao Web

@Entity @NamedQuery(name = "Cliente.findByNome", query = "SELECT c FROM Cliente c WHERE c.nome= :nome") public class Cliente { @Id @Column(name="CD_Cliente", nullable = false) @GeneratedValue(strategy=GenerationType.IDENTITY) Define-se que um Cliente est relacionado private Integer codigo; a diversas reservas e que em reserva este relacionamento identificado como cliente @Column(name = "DS_Nome", nullable = false) (mappedBY). Define-se que as operaes private String nome; em Clientes se propagam em Reservas (cascade) e que ao carregar um Cliente, @Column(name = "DS_Endereco", length=45, nullable = false) suas reservas sero carregadas (fecth) private String endereco; @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "cliente") private List<Reserva> reservas; // Inserir mtodos getters e setters }

JSP/ServletsAs Classes do Sistema

10.54

A Classe Veiculo.java
Veiculo.java package persistence; Apresenta-se o nome da tabela do BD que corresponde a entidade (opcional se o nome for o mesmo). Indica-se o tipo de mapeamento de herana que ser usado para a estrutura hierrquica da qual Veiculo a super-classe, apresentando tambm a coluna que ser utilizada para diferenciar cada uma das subclasses (CD_TIPO).

Sistemas de Informao Web

import java.util.List; import javax.persistence.*;

@Entity @Table(name = "VEICULO") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "CD_TIPO", discriminatorType = DiscriminatorType.STRING) @NamedQuery(name = "Veigulo.recupearPorPlaca", query = "SELECT v FROM Veiculo v WHERE v.ds_placa = :placa") public abstract class Veiculo { @Id @Column(name="CD_Veiculo", nullable = false) @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer codigo; @Column(name = "DS_Placa", nullable = false) private String placa;

JSP/ServletsAs Classes do Sistema

10.55

A Classe Veiculo.java
Veiculo.java continuao... M @Column(name = "DS_Modelo", nullable = false) private String modelo;

Sistemas de Informao Web

@Column(name = "NR_Ano", nullable = false) private Integer ano; @Column(name = "DS_Cor", nullable = false) private String cor; @Column(name = "VL_Diaria", nullable = false) private Double diaria; @OneToMany(cascade = CascadeType.ALL, mappedBy = "veiculo") private List<Reserva> reservas; // Inserir mtodos getters e setters }

JSP/ServletsAs Classes do Sistema

10.56

A Classe Esportivo.java
Esportivo.java package persistence; import javax.persistence.*; Indica o valor que ser utilizado para diferenciar a sub-classe na tabela que far o mapeamento da estrutura hierrquica.

Sistemas de Informao Web

@Entity @DiscriminatorValue("E") public class Esportivo extends Veiculo { @Column(name = "VL_Velocidade", nullable = true) private Integer velocidade; // Inserir mtodos getters e setters } Indica que no BD a coluna equivalente a este atributo poder ter um valor nulo. Por que?

JSP/ServletsAs Classes do Sistema

10.57

A Classe Utilitario.java
Utilitario.java package persistence; import javax.persistence.*;

Sistemas de Informao Web

@Entity @DiscriminatorValue("U") public class Utilitario extends Veiculo { @Column(name = "VL_Passageiros", nullable = true) private Integer passageiros; // Inserir mtodos getters e setters }

JSP/ServletsAs Classes do Sistema

10.58

A Classe Reserva.java
Reserva.java package persistence; import java.util.Date; import javax.persistence.*;

Sistemas de Informao Web

@Entity @NamedQueries({ @NamedQuery(name = "Reserva.listarPorPeriodo", query = "SELECT r FROM Reserva r WHERE " + "r.inicio >= :inicio AND r.fim <= :fim"), @NamedQuery(name = "Reserva.ultima", query = "SELECT r FROM Reserva r WHERE r.codigo = " + "(SELECT MAX(r1.codigo) FROM Reserva r1)") })

Definio de um conjunto de consultas nomeadas.

JSP/ServletsAs Classes do Sistema

10.59

A Classe Reserva.java
Reserva.java continuao... public class Reserva { @Id @Column(name="CD_Reserva") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer codigo; @ManyToOne @JoinColumn(name = "CD_Cliente", nullable = false) private Cliente cliente; @ManyToOne @JoinColumn(name = "CD_Veiculo", nullable = false) private Veiculo veiculo; @Column(name="DT_Inicio", nullable = false) @Temporal(TemporalType.DATE) private Date inicio; @Column(name="DT_IFim", nullable = false) @Temporal(TemporalType.DATE) private Date fim; // Inserir mtodos getters e setters } Embora exista uma descoberta automtica de tipo (ex.: String para Varchar) com o tipo Java Date necessrio declarar explicitamente o tipo do BD (Date, Time ou Timestamp)

Sistemas de Informao Web

Indica a coluna que ser utilizada para a juno que deve ser feita para identificar as reservas associadas ao cliente.

Apresenta o outro lado das associaes definidas em Cliente e Veiculo. Observar que o nome do atributo aquele definido nas entidades Cliente e Veiculo

JSP/ServletsAs Classes do Sistema

10.60

A Classe Locacao.java
Locacao.java package persistence; import javax.persistence.*;

Sistemas de Informao Web

@Entity public class Locacao { @Id @Column(name="CD_Locacao") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer codigo; @OneToOne @JoinColumn(name = "CD_Reserva", nullable = false) private Reserva reserva; // Inserir mtodos getters e setters }

Indica a coluna que ser utilizada para a juno que deve ser feita para identificar a reserva associada locao.

JSP/Servlets

10.61

Dali JPA Tools


Realizar o download em (http://www.eclipse.org/dali/ ) e instalar no Eclipse.

Sistemas de Informao Web

JSP/ServletsMapeamento das Classes

10.62

Criao da Conexo

Sistemas de Informao Web

JSP/Servlets

10.63

Criao das Tabelas

Sistemas de Informao Web

JSP/Servlets

10.64

Criao das Tabelas

Sistemas de Informao Web

JSP/Servlets

10.65

Criao das Tabelas

Sistemas de Informao Web

JSP/Servlets

10.66

Script SQL Gerado (Alteraes)


CREATE TABLE Cliente ( CD_Cliente SERIAL NOT NULL, DS_Nome VARCHAR(255) NOT NULL, DS_Endereco VARCHAR (255) NOT NULL ); M CREATE TABLE Locacao ( CD_Locacao SERIAL NOT NULL, CD_Reserva INTEGER NOT NULL ); ALTER TABLE Reserva ADD CONSTRAINT Reserva_PK PRIMARY KEY (CD_Reserva); ALTER TABLE Locacao ADD CONSTRAINT Locacao_PK PRIMARY KEY (CD_Locacao); ALTER TABLE VEICULO ADD CONSTRAINT VEICULO_PK PRIMARY KEY (CD_Veiculo); ALTER TABLE Cliente ADD CONSTRAINT Cliente_PK PRIMARY KEY (CD_Cliente);

Sistemas de Informao Web

CREATE TABLE VEICULO ( CD_Veiculo SERIAL NOT NULL, DS_Placa VARCHAR (255) NOT NULL, DS_ModeloVARCHAR(255) NOT NULL, NR_Ano INTEGER NOT NULL, DS_Cor VARCHAR (255) NOT NULL, VL_Diaria FLOAT NOT NULL, VL_Velocidade INTEGER NOT NULL, VL_Passageiros INTEGER NOT NULL ); CREATE TABLE Reserva ( CD_Reserva SERIAL NOT NULL, DT_Inicio VARCHAR (255) NOT NULL, DT_IFim VARCHAR (255) NOT NULL, CD_Cliente INTEGER NOT NULL, CD_Veiculo INTEGER NOT NULL ); M

JSP/Servlets

10.67

Finalizao do Contexto de Persistncia

Sistemas de Informao Web

Incluso das classes na unidade de persistncia.

JSP/Servlets

10.68

Finalizao do Contexto de Persistncia


persistence.xml <?xml version="1.0" encoding="utf-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="locadora"> <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> <class>persistence.Cliente</class> <class>persistence.Esportivo</class> <class>persistence.Locacao</class> Incluir manualmente na unidade de <class>persistence.Reserva</class> persistncia as definies para a <class>persistence.Utilitario</class> conexo ao banco de dados. <class>persistence.Veiculo</class> <properties> <property name="toplink.logging.level" value="INFO" /> <property name="toplink.jdbc.driver" value="org.postgresql.Driver" /> <property name="toplink.jdbc.url" value="jdbc:postgresql://localhost:5432/TestJPA" /> <property name="toplink.jdbc.user" value="postgres" /> <property name="toplink.jdbc.password" value=2005pgsql" /> </properties> </persistence-unit> </persistence>

Sistemas de Informao Web

JSP/Servlets

10.69

Gerao das Tabelas

Sistemas de Informao Web

JSP/ServletsMapeamento das Classes

10.70

Tabelas Criadas...
Reserva -- Table: reserva -- DROP TABLE reserva;

Sistemas de Informao Web

CREATE TABLE reserva ( cd_reserva serial NOT NULL, dt_inicio character varying(255) NOT NULL, dt_ifim character varying(255) NOT NULL, cd_cliente integer, cd_veiculo integer, CONSTRAINT reserva_pk PRIMARY KEY (cd_reserva) ) WITHOUT OIDS; ALTER TABLE reserva OWNER TO postgres;

JSP/ServletsMapeamento das Classes

10.71

Um Exemplo
Teste.java package aula10; import javax.persistence.*; import persistence.Cliente; Criao da fbrica abstrata EntityManagerFactory a partir da leitura da unidade de persistncia para a instanciao do Gerenciador de Entidades .

Sistemas de Informao Web

public class Teste { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); Criao do objeto responsvel pela gesto da transao. Cliente cliente = new Cliente(); cliente.setNome("Maria Jos"); cliente.setEndereco("Rua Castro Santos, 333"); Criao de um Pojo Cliente e definio de suas propriedades transaction.begin(); Incio da transao. (entidade no estado NEW T10.17). em.persist(cliente); transaction.commit(); em.close(); emf.close(); } } Persistncia da entidade no BD. A partir deste ponto a entidade passa ao estado MANAGED (T10.17). Finalizao da transao. Liberao dos recursos.

JSP/ServletsMapeamento das Classes

10.72

Um modo mais fcil...


persistence.xml <?xml version="1.0" encoding="utf-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="locadora"> M O valor deste atributo pode ser, none (no faz nada), create-tables (cria as tabelas inexistentes e no altera as existentes) e dropand-create-tables (suprime e recria todas as tabelas). Este atributo ir definir a criao das tabelas de forma automtica pelo TopLink.

Sistemas de Informao Web

<properties> <property name="toplink.ddl-generation" value="create-tables" /> <property name="toplink.logging.level" value="INFO" /> <property name="toplink.jdbc.driver" value="org.postgresql.Driver" /> <property name="toplink.jdbc.url" value="jdbc:postgresql://localhost:5432/TestJPA" /> <property name="toplink.jdbc.user" value="postgres" /> <property name="toplink.jdbc.password" value="pgsql" /> </properties> </persistence-unit> </persistence>

http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-extensions.html#CJAIIDIB

JSP/ServletsMapeamento das Classes

10.73

Tabelas Criadas...
Reserva -- Table: reserva -- DROP TABLE reserva; Apagar as tabelas na base de dados usando o pgAdmin.

Sistemas de Informao Web

CREATE TABLE reserva Aps uma nova execuo de Teste.java, as ( tabelas sero criadas incluindo as chaves cd_reserva serial NOT NULL, estrangeiras. dt_ifim date NOT NULL, dt_inicio date NOT NULL, cd_cliente integer NOT NULL, cd_veiculo integer NOT NULL, CONSTRAINT reserva_pkey PRIMARY KEY (cd_reserva), CONSTRAINT fk_reserva_cd_cliente FOREIGN KEY (cd_cliente) REFERENCES cliente (cd_cliente) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_reserva_cd_veiculo FOREIGN KEY (cd_veiculo) REFERENCES veiculo (cd_veiculo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITHOUT OIDS; ALTER TABLE reserva OWNER TO postgres;

JSP/ServletsMapeamento das Classes

10.74

Utilizando um DAO
ClienteDAO.java package dao; import javax.persistence.*; import persistence.Cliente; Esta classe apresenta as operaes CRUD para manipulao de uma entidade Cliente. Alm disso apresenta uma operao que utiliza a consulta nomeada definida na entidade Cliente

Sistemas de Informao Web

public class ClienteDAO { public Cliente persist(Cliente cliente) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager(); // Cria uma transao e a inicia EntityTransaction transaction = em.getTransaction(); transaction.begin(); em.persist(cliente); transaction.commit(); // Desaloca os elementos em.close(); emf.close(); return cliente; }

Persistncia da entidade no BD. A partir deste ponto a entidade passa ao estado MANAGED (T10.17).

JSP/ServletsMapeamento das Classes

10.75

Utilizando um DAO
ClienteDAO.java continuao... M public Cliente find(Integer id) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager();

Sistemas de Informao Web

// Cria uma transao e a inicia EntityTransaction transaction = em.getTransaction(); transaction.begin(); Cliente cliente = em.find(Cliente.class, id); transaction.commit(); // Desaloca os elementos em.close(); emf.close(); return cliente; } Busca de uma entidade no BD. A partir deste ponto a entidade passa ao estado MANAGED (T10.17).

JSP/ServletsMapeamento das Classes

10.76

Utilizando um DAO
ClienteDAO.java continuao... M public void remove(Cliente cliente) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager();

Sistemas de Informao Web

// Cria uma transao e a inicia EntityTransaction transaction = em.getTransaction(); transaction.begin(); em.remove(cliente); transaction.commit(); // Desaloca os elementos em.close(); emf.close(); } Remoo de uma entidade no BD. A partir deste ponto a entidade passa ao estado REMOVED (T10.17).

JSP/ServletsMapeamento das Classes

10.77

Utilizando um DAO
ClienteDAO.java continuao... M public Cliente update(Integer id, Cliente cliente) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager();

Sistemas de Informao Web

// Cria uma transao e a inicia EntityTransaction transaction = em.getTransaction(); transaction.begin(); Cliente clienteUpd = em.find(Cliente.class, id); clienteUpd.setNome(cliente.getNome()); clienteUpd.setEndereco(cliente.getEndereco()); transaction.commit(); // Desaloca os elementos em.close(); emf.close(); return clienteUpd; } Verificar como a operao merge pode ser utilizada... Busca de uma entidade no BD. A partir deste ponto a entidade passa ao estado MANAGED (T10.17). Porque no necessrio realizar um persist aps as alteraes?

JSP/ServletsMapeamento das Classes

10.78

Utilizando um DAO
ClienteDAO.java continuao... M public Cliente findByNome(String nome) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora"); EntityManager em = emf.createEntityManager();

Sistemas de Informao Web

Query query = em.createNamedQuery("Cliente.findByNome"); query.setParameter("nome", nome); Cliente cliente = (Cliente) query.getSingleResult(); return cliente; } }

Utilizao da consulta nomeada declarada na entidade Cliente.

JSP/Servlets

10.79

Um Sistema de Logging
O processo de Logging em um sistema corresponde a apresentao ou salvamento em arquivo, de mensagens produzidas durante a execuo do sistema de extremo interesse durante a fase de depurao de um sistema.
Sistemas de Informao Web

Este processo

Uma das ferramentas mais utilizadas para Logging o Log4J que uma API que faz parte do projeto Jakarta warn, error e fatal ser apresentada. Se o nvel for definido por exemplo como debug todas as mensagens so apresentadas Com o nvel definido como fatal, automaticamente somente mensagem causada por um Fatal Error so mostradas.
Fontes: http://hotwork.sourceforge.net/hotwork/manual/log4j/log4j-user-guide.html#, http://www.guj.com.br/java.artigo.130.1.guj, http://www.vipan.com/htdocs/log4jhelp.html

http://logging.apache.org/log4j/.

O Log4J classifica os logs (mensagens) em uma estrutura hierrquica: debug, info, Cada um dos nveis indica em que situao a mensagem deve

JSP/Servlets

10.80

Um Sistema de Logging
O Log4J configurado a partir de um arquivo denominado log4j.properties Este arquivo deve ficar na raiz da aplicao (adicionar ao projeto em Java Indica que o nvel de log deve ser Resources: src).
Sistemas de Informao Web
log4j.properties log4j.rootCategory=DEBUG, dest1 log4j.appender.dest1=org.apache.log4j.ConsoleAppender log4j.appender.dest1.layout=org.apache.log4j.PatternLayout

DEBUG, que o mais baixo. Todas as mensagens so apresentadas em dest1. Indica que dest1 deve ser a console.

Utilizao
import org.apache.log4j.Logger;

Indica o padro que deve ser usado na apresentao das mensagens PatternLayout indica que se deve apresentar a mensagem e um salto de linha.

// Cria o objeto de controle de log Logger log = Logger.getLogger(NomeClasse.class); log.info("Mensagem a ser apresentada");
Utilizao com o nvel info Caso se altere por exemplo para error, somente se ocorrer um erro a mensagem ser apresentada.

JSP/Servlets

10.81

Log4J: Configurao mais Completa


log4j.properties #### Usando 2 appenders, 1 para logar no console, outro para um arquivo log4j.rootCategory=INFO, stdout, fileOut p prioridade

Sistemas de Informao Web

#### O primeiro appender escreve no console log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# Pattern que mostra o nome do arquivo e numero da linha. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%p [%t] (%F:%L) - %m%n #### O segundo appender escreve em um arquivo log4j.appender.fileOut=org.apache.log4j.RollingFileAppender log4j.appender.fileOut.File=example.log # Controla o tamanho maximo do arquivo log4j.appender.fileOut.MaxFileSize=100KB # Pattern que mostra o nome do arquivo e numero da linha. log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout log4j.appender.fileOut.layout.ConversionPattern=%p %t (%F:%L) - %m%n

t - nome da thread que gerou o evento de log F - nome do arquivo Java L nmero da linha onde o log foi gerado m - a mensagem (no pode faltar !) n - o separador de linhas padro do sistema operacional - "\n" ou "\r\n"

JSP/ServletsMapeamento das Classes

10.82

Utilizando um DAO
TesteDAO.java package aula10; import org.apache.log4j.Logger; import persistence.Cliente; import dao.ClienteDAO; public class TesteDAO { public static void main(String[] args) { Logger log = Logger.getLogger(TesteDAO.class); ClienteDAO clienteDAO = new ClienteDAO(); Cliente cliente = new Cliente(); cliente.setNome("Jos da Silva"); cliente.setEndereco("Rua Aparecida, 77"); cliente = clienteDAO.persist(cliente); log.info("Cliente Salvo:\nCdigo: " + cliente.getCodigo()); Criao da entidade e definio do valor de suas propriedades. Persistncia da entidade utilizando o DAO.

Sistemas de Informao Web

Criao de um objeto DAO.

JSP/ServletsMapeamento das Classes

10.83

Utilizando um DAO
TesteDAO.java M Cliente maria = clienteDAO.findByNome("Maria Jos"); log.info("\nDados de Maria: " + maria.getCodigo()); Utilizao da consulta nomeada atravs do DAO.

Sistemas de Informao Web

Cliente newCliente = new Cliente(); newCliente.setNome("Jos da Silva Pereira"); newCliente.setEndereco("Rua Aparecida, 77"); cliente = clienteDAO.update(cliente.getCodigo(), newCliente); log.info("\nCliente Alterado: " + cliente.getCodigo()); } }

Atualizao da entidade atravs do DAO.

JSP/Servlets

10.84

Utilizao com Hibernate


Pode-se utilizar o Plugin Hibernate Tools para criar os arquivos de configurao do Hibernate, ou pode-se utilizar classes Java anotadas com as anotaes JPA.
Sistemas de Informao Web

Como JPA uma especificao, pode-se alterar o Provedor de Persistncia utilizado de maneira bastante simples Deve-se definir uma nova Unidade de Persistncia com parmetros apropriados ao Hibernate. Deve-se obter do site do Hibernate (http://www.hibernate.org/6.html) os pacotes Hibernate Core e Hibernate EntityManager.

JSP/Servlets

10.85

Utilizao com Hibernate: Core


Deve-se obter o mdulo Hibernate Core (mdulo central do framework) Em seguida, deve-se descompactar o Hibernate Core em um diretrio, criar na aplicao o diretrio WEB-INF/lib (caso no exista) e copiar para l, a partir dos
Sistemas de Informao Web

arquivos do diretrio descompactado, os seguintes arquivos:


antlr.jar cglib.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar hibernate3.jar jta.jar dom4j.jar log4j.jar c3p0.jar

Em seguida deve-se adicionar estes arquivos ao classpath da aplicao O conjunto de arquivos listados um conjunto mnimo Em algumas situaes podem ser necessrios outros arquivos Verificar arquivo _README.txt no diretrio lib da instalao.

JSP/Servlets

10.86

Utilizao com Hibernate: EntityManager


Deve-se copiar diversos arquivos para a pasta WEB-INF/lib da aplicao e depois incluir estes arquivos em seu classpath: javassist.jar (pacote Hibernate Core), hibernate-entitymanager.jar (pacote Hibernate EntityManager), hibernateSistemas de Informao Web

annotations.jar, ejb3-persistence.jar, hibernate-annotations.jar, hibernate-commonsannotations.jar, hibernate-validator.jar e jboss-archive-browsing.jar (diretrio lib do pacote Hibernate EntityManager)

Criar um novo projeto denominado aula10_01 para utilizao com o exemplo com Hibernate

JSP/Servlets

10.87

Hibernate Unidade de Persistncia


persistence.xml <?xml version="1.0" encoding="utf-8"?> Definio explicita de que as <persistence xmlns="http://java.sun.com/xml/ns/persistence" transao sero declaradas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" localmente. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="locadora" transaction-type="RESOURCE_LOCAL"> Definio do Hibernate como <provider>org.hibernate.ejb.HibernatePersistence</provider> provedor de persistncia. <class>persistence.Cliente</class> <class>persistence.Esportivo</class> none: vo faz nada quando o sistema executado <class>persistence.Locacao</class> create: cria toda a estrutura de banco no primeiro acesso <class>persistence.Reserva</class> update: verifica as atualizaes e reflete no banco <class>persistence.Utilitario</class> drop: apaga as tabelas no banco <class>persistence.Veiculo</class> drop-create: apaga e ento cria as tabelas no banco <properties> <property name="hibernate.hbm2ddl.auto" value="none"/> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/TestJPA" /> <property name="hibernate.connection.username" value="postgres" /> <property name="hibernate.connection.password" value=2005pgsql" /> </properties> </persistence-unit> </persistence>

Sistemas de Informao Web

JSP/Servlets

10.88

Hibernate Criao da Base de Dados


GenerateDatabase.java package aula10_01; import java.util.Properties;

Sistemas de Informao Web

import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class GenerateDatabase { public static void main(String[] args) { Properties cfg = new Properties(); cfg.setProperty("hibernate.hbm2ddl.auto", drop-create");

Criao e definio local do valor de uma propriedade denominada hibernate.hbm2ddl.auto.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("locadora", cfg); EntityManager em = emf.createEntityManager(); em.close(); emf.close(); } } A simples criao do Gerenciador de Entidades faz com que a base de dados seja apagada e criada. Mescla das propriedades definidas na unidade de persistncia com a propriedade local. Criar uma classe idntica a utilizada no projeto Aula 10 (mas em um pacote aula10_01) e executar novamente a classe. Para ela nada mudou...

JSP/Servlets

10.89

Exerccios
Exerc Exerccio 1:

Sistemas de Informao Web

1. Realizar uma leitura detalhada do documento Hibernate Annotations (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/) familiarizao com o conjunto completo de Anotaes disponibilizados pela JPA.
Exerccio 2: Exerc

Criar uma pgina Web com os campos necessrios ao cadastro de uma Reserva por um Cliente para um Veculo. Esta pgina deve ter trs botes que permitam a insero, alterao e excluso dos dados da reserva.
Exerccio 3: Exerc

Utilizando a JPA (TopLink ou Hibernate), desenvolver um Servlet que faa o tratamento da pgina, inserindo, alterando ou excluindo os dados de acordo com o boto pressionado na pgina JSP, e depois retorne a prpria pgina. Deve-se utilizar o padro DAO.

JSP/Servlets

10.90

Bibliografia
1. Sang Shin Java Passion, Java Persistence API: Simplifying Persistence, Passion, Persistence, http://www.javapassion.com/j2ee/#jpa1 Esta aula fortemente baseada neste excelente material. 2. Enterprise JavaBeans 3.0, Bill Burke, Richard Monso-Haefel, Pearson, 2007. 3. Renato Bellia, Uma Aplicao Java EE Completa, Java Magazine n 44, Ano V, pgs. 27-36. 4. Andr Dantas Rocha e Srgio Oliveira Kubota, Persistncia no Java EE 5, Java Magazine n 39, Ano V, pgs. 29-37. 5. The Java Persistence API - A Simpler Programming Model for Entity Persistence: http://java.sun.com/developer/technicalArticles/J2EE/jpa/ 6. An Introduction to Java Persistence for Client-Side Developers: http://today.java.net/pub/a/today/2006/05/23/ejb3-persistence-api-for-client-side-developer.html 7. Java Persistence APIs: https://blueprints.dev.java.net/bpcatalog/ee5/persistence/index.html 8. Standardizing Java Persistence with the EJB3 Java Persistence API: http://www.onjava.com/pub/a/onjava/2006/05/17/standardizing-with-ejb3-java-persistenceapi.html?page=1 9. Especificao EJB3: http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html 10. Anotaes JPA (documento do Hibernate): http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html 11. Fontes sobre JPA: http://beyondclick.wordpress.com/2007/02/17/java-persistence-api-jpa/

Sistemas de Informao Web