Você está na página 1de 18

Centro Federal de Educação Profissional e Tecnológica do RN

Departamento Acadêmico de Tecnologia da Informação


Curso de Tecnologia em Análise e Desenvolvimento de Sistemas

Java Persistence API

Exemplo Prático
“Sistema de Biblioteca”
Sistema de Biblioteca
● O nosso sistema exemplo é destinado a atender
as necessidades de uma Biblioteca, e deve
contemplar as seguintes funcionalidades:
– Manutenção dos cadastros de livros, dos usuários
da biblioteca (aqueles que podem pegar emprestado
livros da biblioteca) e dos usuários do sistema
– Registrar o empréstimo de livros
– Registrar a devolução de livros
● Cálculo de multa em função de devolução em atraso
– Registrar o pagamento de multa por atrasos
– Pesquisar livros (por título, autor e editora)
2
Sistema de Biblioteca
● Algumas regras do negócio:
– A biblioteca serve a alunos, professores e servidores
de uma instituição de ensino
– Limites de empréstimo de livros: 5 (cinco) se for
aluno ou funcionário e 10 (dez) se for professor
– As multas podem ser pagas no ato da devolução ou
a posteriori a critério do usuário
– Para pegar livros emprestados o usuário não pode
estar devendo o pagamento de multas
– O usuário que doar um livro a biblioteca pode abater
até R$ 20,00 de multa
3
Esquema da Aplicação
Implementado Anteriromente

4
Primeira Versão do Modelo de
Domínio do Sistema da Biblioteca

5
Elementos a Serem Implementados
● Beans de entidade a serem implementados:
– Livro
– Atendente
– Usuario
● Beans de sessão a serem implementados:
– Acervo
● Gerencia os livros pertencentes ao acervo da biblioteca
– GerenteCadastros
● Gerencia os cadastros dos usuários da biblioteca e dos
usuários do sistema
6
Código da Entidade Livro
package exemplo.biblioteca.modelo;
import javax.persistence.*;

@NamedQueries({
@NamedQuery(name="findAllLivros",
query="SELECT l FROM Livro l")})
@Entity
public class Livro implements java.io.Serializable {
private int id;
private String titulo;
private String isbn;

@Id
@GeneratedValue
public int getId() { return id; }
public void setId(int novo) { id = novo; }

// Demais acessadores e modificadores...


} 7
Tabela Correspondente à Entidade
Atendente
● A referida tabela deverá ser criada no banco de
dados antes da implantação da aplicação:
create table TABELA_ATENDENTE
(
ATENDENTE_ID integer primary key not null,
NOME varchar(255) not null,
LOGIN varchar(20) not null,
SENHA varchar(20) not null
);

8
Código da Entidade Atendente
package exemplo.biblioteca.modelo;
import javax.persistence.*;
// Consulta nomeada para retornar todos os atendentes...
@Entity
@Table(name=“TABELA_ATENDENTE”)
public class Atendente implements java.io.Serializable {
private int id;
private String nome;
private String login;
private String senha;
@Id
@GeneratedValue
@Column(name=“ATENDENTE_ID”, columnDefinition=“integer”)
public int getId() { return id; }
...
@Column(name=“LOGIN”, length=20)
public String getLogin() { return login; }
...
} 9
Código Entidade Usuario
package exemplo.biblioteca.modelo;

public class Usuario implements java.io.Serializable {


private int id;
private String nome;
private String matricula;
private String telefone;

public int getId() { return id; }


public void setId(int novo) { id = novo; }

public String getNome() { return nome; }


public void setNome(String novo) { nome = novo; }
public String getMatricula() { return matricula; }
public void setMatricula(String novo) { matricula = novo; }
public String getTelefone() { return telefone; }
public void setTelefone(String novo) { telefone = novo; }
}
10
Descritor de Mapeamento
Objeto/Relacional
● A classe Usuario não tem nenhuma anotação
que indique que é um bean de entidade
● A definição desta classe como bean de entidade
é feita através do arquivo específico para
mapeamento objeto-relacional – orm.xml
– Este arquivo é procurado, por padrão, no ato da
implantação de um módulo EJB
● O arquivo orm.xml se encontra no diretório
/META-INF do projeto contendo as entidades

11
Descritor de Mapeamento
Objeto/Relacional
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<entity class="exemplo.biblioteca.modelo.Usuario"
access="PROPERTY">
<named-query name="findAllUsuarios">
<query>SELECT
query u FROM Usuario u</query>
/query
</named-query>
/named-query
<attributes>
attributes
<id name="id">
<generated-value strategy="IDENTITY"/>
</id>
</attributes>
/attributes
</entity>
/entity
</entity-mappings>
/entity-mappings
12
Descritor de Implantação dos Beans
de Entidade
● O persistence.xml também fica no /META-INF
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="BibliotecaEJB">
<provider>org.hibernate.ejb.HibernatePersistence<
provider /provider>
/provider
<jta-data-source>java:/DefaultDS<
jta-data-source /jta-data-source>
/jta-data-source
<properties>
properties
<property name="hibernate.hbm2ddl.auto"
value="update"/>
</properties>
/properties
</persistence-unit>
/persistence-unit
</persistence>
/persistence
13
Interface Remota do Bean de
Sessão sem Informação de Estado
package exemplo.biblioteca;

import java.util.List;
import javax.ejb.Remote;
import exemplo.biblioteca.modelo.Livro;

@Remote
public interface Acervo {
public List<Livro> getLivros();
public Livro getLivroById(int id);
public void adicionaLivro(Livro novo);
public void removeLivro(Livro aRemover);
public Livro atualizaLivro(Livro atual);
}

14
Classe do Bean de Sessão sem
Informação de Estado
package exemplo.biblioteca;
// Imports...
public @Stateless class AcervoBean implements Acervo {
@PersistenceContext(unitName="BibliotecaEJB")
private EntityManager em;
@SuppressWarnings("unchecked")
public List<Livro> getLivros() {
if (em != null) {
Query query = em.createNamedQuery("findAllLivros");
em.createNamedQuery("findAllLivros")
List<Livro> resultList = query.getResultList();
query.getResultList()
return resultList;
}
return null;
}
public Livro getLivroById(int id) {
if (em != null) {
return em.find(Livro.class, id);
id)
}
return null; 15
}
Classe do Bean de Sessão sem
Informação de Estado
public void adicionaLivro(Livro novo) {
if (em != null) {
em.persist(novo);
}
}
public void removeLivro(Livro aRemover) {
if (em != null) {
em.remove(aRemover);
}
}
public Livro atualizaLivro(Livro atual) {
if (em != null) {
return em.merge(atual);
}
return null;
}
}

16
Implementação do Bean de Sessão
sem Estado - GerenteCadastos
● Implemente do bean de sessão sem estado
GerenteCadastros
– Interface remota
– Classe do bean
● Este bean deverá ter as seguintes funções:
– Recuperação, inserção, atualização e remoção dos
usuários da biblioteca (Usuario)
Usuario e dos usuários do
sistema (Atendente)
Atendente
● Utilize os mesmos conceitos aplicados no bean
de sessão Acervo
17
Implementação da Camada de
Apresentação
● Construa, no Módulo Web,
Web da biblioteca os JSPs
e Servltes necessários às funcionalidades:
– Página para listar todos os Livros
● Opções para inserir, remover e atualizar um Livro
– Página para listar todos os Atendentes
● Opções para inserir, remover e atualizar um Atendente
– Página para listar todos os Usuarios
● Opções para inserir, remover e atualizar um Usuario
● Implante e teste a aplicação

18