Você está na página 1de 34

Curso de Introdução a JPA

Roteiro de Execução

IDE Release

Eclipse Indigo
Oracle VM
NetBeans

1 - Preparando o ambiente

Objetivo: Configurar o a máquina virtual em computador local

1. Faça download da oracle virtual machine


1.1. Entre no site: https://www.virtualbox.org/wiki/Downloads
1.2. Baixe e instale a versão específica para seu sistema operacional

2. Importar a máquina virtual


1.1 Clique em Machine/Add...

1.2 Escolha o disco virtual disponibilizado, clique em Open e Inicie a máquina


clicando no botão Start.
2 - Criar Aplicação no Netbeans

Objetivo: Criar uma nova apliação no netbeans.

2.1 Clique em New Project

2.2 No menu Categories selecione Java e no menu Projects selecione Java


Application. Clique em next.
2.3 Nomeie a aplicação como SampleApplication. Clique em Next.

2.5 Clique em Finish.

2.6 Para que o código da aplicação fique separado em suas devidas camadas, serão
criados mais dois pacotes: controller e model.
4 - Criar novo banco de Dados

Objetivo: Criar um novo banco de dados para aplicação.

3.1 Abra o PGAdminIII

3.2 Expanda a ávore de gerenciamento do banco até chegar em databases, clique com o
botão direito/New Database...
3.3 Digite o nome do banco de dados “sampleDB”/Clique em OK.
4 - Criar Uma nova conexão com o banco de Dados

Objetivo: Criar uma nova conexão com o banco de dados.

4.1 Clique na aba services.


4.1.1 Verifique que há vários tipos de serviços disponíveis e esse menu nos dá
opção de configurá-los.

4.2 Clique com o botão direito no serviço Database. Depois em new Connection...

4.3 Na opção Driver Selecione o banco de dados desejado. Neste curso será utilizado o
banco de dados PostgreSQL. Portanto selecione essa opção no menu Driver. Clique em
Next.

4.4 Digite as especificações do banco de dados conforme segue. Verifique se a conexão


com o banco foi bem sucedida através do botão test Connection. Clique em next.

Login: postgres
Senha: postgres

4.5 Selecione o schema do banco de dados como public. Clique em Finish.


4.6 A nova conexão aprecerá na aba de serviços.

A partir dessa conexão é também possível gerenciar o banco de dados. Isto é, criar
novas tabelas e visões sem a necessidade de utilizar comandos SQL.
5 - Criar um persistence unit e entender o arquivo de configuração

Objetivo: Compreender o funcionamento dos arquivos de configuração da API de


persistência.

5.1 Na aba projects, selecione o projeto desejado, clique com o botão


direito/New/Persistence Unit.

● Caso não esteja aparecendo no seu menu de contexto, selecionar a opção New ->
Other..., em Categories selecionar Persistence e em File Types selecionar a opção
Persintence Unit.

5.2 Selecione a Persistence Library como EclipseLink(JPA 2.0) e a Database Connection


como a connection criada anteriormente. No caso a sampleDB[postres]. Clique em Finish.
5.3 Verifique que será criado a arquivo de configuração Persistence.xml.

● O principal elemento definido no arquivo é a Persistence Unit (Unidade de


Persistência) pois é por meio dela que todas as outras configurações são
encontradas pelo framework de persistência.
● Uma Persistence Unit sempre deve ter um nome para que seja possível sua
localização pelo framework de persistência.

5.4 O conteúdo do arquivo de configuração persistence.xml

● O arquivo XML persistence.xml define as configurações necessárias para que o


framework de persistência possa interagir com uma aplicação.

● A propriedade name indica o nome da Persistence Unit e a propriedade


transaction-type indica se as transações são controladas pela aplicação
(RESOURCE_LOCAL) ou pelo container (TRANSACTION).
● Para cada classe mapeada para uma tabela no banco, temos uma entrada da tag
<class>.

● A tag <property> é utilizada para especificar as propriedades de conexão com o


banco de dados.
6 - Criar uma fábrica de EntityManager
G
Objetivo: Aprender a Utilizar a Classe EntityManagerFactory para criar instâncias do
EntityManager.

● Duas importantes classes da JPA serão utilizadas: EntityManagerFactory e


EntityManager.
○ EntityManagerFactory: Responsável por criar objetos do tipo EntityManager
de acordo com a Persistence Unit passada como parâmetro.
○ EntityManager: Representa um contexto de persistência (cache) e fornece os
métodos para que os objetos Java possam ser persistidos no banco de dados e
posteriormente consultados. De uma maneira simplista, pode ser visto como o
objeto sque representa a conexão com o banco de dados.
* o método createEntityManagerFactory busca as configurações do banco através da
PersistenceUnit especificada.

7 - Utilizar abordagem de Egenharia Avante Para Persistir um objeto utilizando uma


Intância do EntityManager

* Engenharia Avante: processo tradicional de partir de um nível de abstração alto e


chegar ao nível de implementação do sistema.

Objetivo: Aprender a Utilizar uma instância da Classe EntityManager para persistir um


objeto qualquer utilizando uma abordagem avante. Ou seja: especificar a
entidade, anotar, criar a relação no banco, instanciar um objeto e
persistir.

7.1 Suponha seguinte classe.


7.2 Criar uma classe POJO com anotações básicas.
7.2.1 Clique sobre o pacote que deseja armazenar a classe/New/EntityClass;

7.2.2 Digite o nome da classe e clique em Finish.

*Note que o Netbeans gerará uma classe básica que implementa serializable e
possuir alguns atrbutitos. Por enquanto abstraia as anotações e demais
conteúdos gerados, apenas termine de adicionar os demais atributos na
classe.

7.2.3 Classe Produto completa.


7.3 Crie a tabela no banco de Dados
7.3.1 Clique na aba services, expanda a conexão sampleDB até a “pasta”
Tables do schema public. Clique com o botão direito/create Table. Crie a
nova tabela Produto que represente a classe produto.

7.4 Persistir objeto.


7.4.1 No pacote controller, crie uma classe denominada Application01.
7.4.2 adicione o metodo main a classe.
7.5 Execute a aplicação clicando com o botão direito em cima do arquivo
Application01.java

8 - Utilizar geração de Entidades a partir do banco de dados

Objetivo: Aprender a gerar a camada de modelo a partir do banco de dados

8.1 Uma vez que o modelo lógico do banco de dados da aplicação já está
pronto, é possivel gerar a camada de modelo da aplicação a partir dele.
Para isso, faça os passos a seguir.
8.1.1 Clique na aba projects e expanda a árvore de diretórios até o pacote
que deseja gerar as entidades(pacote model).
8.1.2 Clique com o botão direito do mouse/New/Entity Classes from database.

8.1.3 Selecione as relações do banco que serão utilizadas para gerar as


classes de entidade.

8.1.4 Clique em Next na tela seguinte.


*NamedQuery = Templates de consulta previamente definidos na classe.

Para exemplos de como utilizar NamedQueries acesse:


http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa
_overview_query.html#jpa_overview_query_named

*JABX - Java Architecture form XML Binding é um padrão Java que define como
objetos java são convertido de e para XML.
Um exemplo simples de como utilizar JABX pode ser encontrado no endereço:
http://www.vogella.com/articles/JAXB/article.html

8.15 Opções de mapeamento.


● Association Fetch:
○ Eager = sempre que o objeto pai for trazido da base de dados, o atributo
mapeado com eager fará com que seu conteúdo também seja trazido.
○ Lazy = sempre que o objeto pai for trazido da base de dados, o atributo
mapeado com lazy fará com que seu conteúdo somente seja trazido quando
acessado pela primeira vez.
9 - Relacionamento 1-1 Unidirecional e Bidirecional

Objetivo: Aprender como a JPA mapeia relacionamentos 1-1 uni e bidirecional

9.1 Relacionamento Unidirecional


9.1.1 Suponha a seguinte situação:

9.1.2 Abra o pgadmin


9.1.3 Expanda a árvre de objetos do banco e crie a tabela Pessoa
9.1.4 crie a tabela gerente;
create table gerente(
cpf varchar(11) not null,
nome varchar(50),
constraint pkGerente primary key(cpf)
);

9.1.5 crie a tabela departamento. Atenção para não esquecer a chave estrangeira de
departamento.
create table departamento(
numero int not null,
gerente varchar(11),
sigla varchar(5) not null,
endereco varchar(20),

constraint pkDepartamento primary key (numero),


constraint fkDepartamento foreign key(gerente) references gerente(cpf),
constraint uqDepartamento unique(gerente)

);

9.1.6 Faça a geração das entidades a partir do banco de dados.


9.1.7 Observe as classes geradas. Note que nem sempre a geração das entidades a partir
do banco é feita da melhor maneira.
* se esquecer a clausula unique pode ser que o gerador “entenda” que é um
relacionamento 1:N
9.1.8 Utilize a classe Application03 para testar a persistência.

9.1.9 Entendendo as anotações utilizadas

@Entity = declara que a classe é uma entidade persistente.

@Table(name= “gerente”) = indica qual é a tabela no banco de dados que é


respectiva a essa classe (quando o nome da classe e o nome da tabela são iguais, esta
anotação não é necessária). O parâmetro ‘name’ indica o nome da tabela.

@Id: denota o atributo identificador da classe, que é respectivo à chave primária da


tabela.

Quando o id é do tipo inteiro, é possível utilizar sequenciadores do banco Postgres.


Para isso utilize as anotações:

A anotação a seguir declara um sequence


@SequenceGenerator(name="Gerente_Generator", sequenceName="Gerente_sequence")

A anotação a seguir declara que a estratégia de geração será através de Sequences e


aponta para o sequenciador que foi anteriomente declarado.
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Gerente_Generator")

@Column: indica onomedacolunaqueémapeadoaoatributo(quandoonomedoatributoe


o nome da coluna são iguais, esta anotação não é necessária).Oparâmetro‘name’indica
o nome da coluna; o parâmetro ‘nullable’ denota se a colunapodesernula;oparâmetro
‘unique’ mostra se o atributo deve possuir um valor único para cada instância da
classe.

@JoinColumn: indica qual coluna na tabela ‘detalhe’ é a chave estrangeira vinda da


tabela ‘mestre’. O parâmetro ‘name’ denota o nome da coluna; o parâmetro
‘referencedColumnName’ indica o nome da chave primária na tabela mestre; o parâmetro
‘nullable’ mostra se a coluna da chave estrangeira pode ou não ser nula.

9.2 Relacionamento Bidirecional.


9.2.1 Para tornar o relacionamento bidirecional é necessário alterar apenas a classe
gerente e adicionar a anotação.

10 - Associações 1-N(One-to-Many)

Objetivo: Aprender como a JPA mapeia relacionamentos 1-N

10.1 Considere a situação a seguir.

O relacionamento diz que um coordenador pode trabalhar(coordenar) diversos projetos.


Tal situação configura um relacionamento um-para-muitos.

10.1.2 Crie a tabela Coordenador.


create table coordenador(
cpf varchar(11) not null,
nome varchar(20) not null,
endereco varchar(50),
constraint pkCoordenador primary key (cpf)
);

10.1.3 Crie a tabela projeto.

create table projeto(


numero int not null,
nome varchar(20) not null,
descricao varchar(50),
coordenador varchar(11),

constraint pkProjeto primary key(numero),


constraint fkProjeto foreign key (coordenador) references coordenador(cpf)

);

10.2 faça a geração das entidades pelo netbeans.

10.3 Analise o código gerado na classe coordenador.

@OneToMany: declara que trata-se de um relacionamento um para muitos (um coordenador


pode trabalhar em agências).

Pode ser utilizado o parâmetro ‘cascade’ para indicar que qualquer operação efetuada em
um banco deve ser cascateada para os suas respectivas agências;

cascade = CascadeType.ALL
As opções decascatapodemserdefinidasporoperaçãodepersistênciaquesedesejaque
se torne transitiva, i.e., individualmente para as operações de inserção
(CascadeType.PERSIST), atualização (CascadeType.MERGE) ou deleção
(CascadeType.REMOVE); ou abranger todas essas operações conjuntamente
(CascadeType.ALL).

‘mappedBy’ = indica qual é o atributo do outro lado do relacionamento,

10.4 Analise o código gerado para na classe projeto.

@ManyToOne = declaraumrelacionamentomuitosparaum,ouseja,maisdeumprojetopode
ser associado a um único coordenador.

10.5 Utilize a classe Application04 para persistir um coordenador e vários projetos.

10.6 Utilize a classe Application05 recuperar um coordenador.


11 - Associações M-N(Many-to-Many)

Objetivo: Aprender como a JPA mapeia relacionamentos M-N

11.1 Mapeamento de relacionamento M-N sem atributos


11.1.1 Considere a seguinte situação

*Relacionamento M:N sem atributos na associação. Só é necessário criar umaclassepara


id, caso haja atributos na associação.

11.1.2 Crie a tabela aluno.


create table aluno(
cpf varchar(11) not null,
nome varchar (50) not null,
constraint pkAluno primary key(cpf)
);

11.1.3 Crie a tabela disciplina.


create table disciplina(
numero int not null,
nome varchar(50) not null,
constraint pkDisciplina primary key(numero)
);

11.1.4 Crie a tabela cursa.


create table cursa(
cpf varchar(11) not null,
numero int not null,
constraint pkCursa primary key (cpf, numero),
constraint fkCursaAluno foreign key (cpf) references aluno(cpf),
constraint fkCursaDisciplina foreign key (numero) references disciplina(numero)

);

11.1.5 Gere as classes de entidade pelo netbeans.

11.1.6 Verifique que neste caso o netbeans não gerou uma classe para representar a
chave estrangeira dorelacionamentocursa.Gerarumanovaclassedeveserfeitosomente
quando há atributos na relação.

11.1.7 Utilize a classe Application06 para testar a persistencia.

11.1.8 Utilize a classe Application07 para testar a persistencia do relacionamento


cursa.

11.2 Mapeamento de relacionamento M-N com atributos.


11.2.1 Considere a seguinte situação.

11.2.2 Observe que neste caso o relacionamento cursa possui atributo. Portanto,deverá
ser criada uma classe para mapeá-la.

11.2.3 Crie a tabela aluno.

create table aluno(


cpf varchar(11) not null,
nome varchar(50) not null,
constraint pkAluno primary key(cpf)
);

11.2.4 Crie a tabela disciplina.

create table disciplina(


numero int not null,
nome varchar(50) not null,
constraint pkDisciplina primary key(numero)
);

11.2.4 Crie a tabela cursa.

create table cursa(


cpf varchar(11),
numero int not null,
periodo varchar(7) not null,
constraint pkCursa primary key(cpf, numero),
constraint fkCursaAluno foreign key(cpf) references aluno(cpf),
constraint fkCursaDisciplina foreign key(numero) references
disciplina(numero)
);

11.2.5 Faça a geração das entidades pelo netbeans.

11.2.6 Verifique as classes que foram geradas. Note que desta vez foram criadas as
classes Cursa e CursaPK.

12 - Mapeamento de Herança

Objetivo: Conhecer como é feito o mapeamento de Herança em JPA

12.1 É importante ressaltar que nem todo relacionamento entre entidades trata de
questões de cardinalidade, ou seja, nem sempre a relação entre duas entidades é
meramente quantitativa.

12.2 Considere a seguinte situação.


12.3 Crie a tabela funcionário
create table funcionario(
cpf varchar(11) not null,
dtype varchar(20) not null,
nome varchar(50) not null,
sexo char(1) not null,
comissao float,
constraint pkFuncionario primary key (cpf)
);
12.4 Faça a geração das classes de entidade pelo netbeans.
12.5 Verifique que o netbeans não consegue identificar o relacioamento de herança.
12.6 modifique a classe Funcionário
12.6.1 Remova o atributo comissao e seus respectivos métodos.

12.6.2 Adicione as anotações nas classe.

*@Inheritance:  determina um relacionamento de herança. O parâmetro strategy determina qual será
o tipo de estratégia utilizada (tabela por hierarquia, tabela por classe ou tabela por subclasse).
@DiscriminatorColumn: declara qual é o campo da tabela que determina o tipo do objeto . O
parâmetro name determina o nome desse campo.
● Atenção as estratégias de mapeamento de herança:
○ Uma tabela para toda a hierarquia.

○ Uma tabela para cada entidade na hierarquia

○ Uma tabela  por  entidade­filha mais especializada.

12.7 Crie a classe Vendedor.


*@DiscriminatorValue:  determina  qual  é  o  valor  que  identifica  uma  instância  da  classe
ClienteFisico  no  banco  de  dados.  No  caso,   a  string  “Vendedor”  será  inserida  na  coluna  dtype  da
tabela Funcionario para indicar que a tupla trata­se de um vendedor.

12.8 Crie a classe Comprador.

12.9 Utilize classe Application08 para testar a persistência utilizando Herança.

12 - Conhecendo melhor a Classe Entity Manager

Objetivo: Conhecer melhor a classe Entity Manager Bem como alguns dos seus principais
métodos.

12.1 Conhecendo o método persist.


12.1.1 o método “public void persist(Object o);” marca um objeto para ser persistido no
banco.
12.2 Conhecendo o método “public <T extends Object> T merge(T t);”
12.2.1 O métodomergealteraosvaloresdosatributos/relacionamentosdeumobjeto.Além
disso, ele também anexa o objeto ao contexto de persistência(Quando necessário).

12.3 O método“publicvoidremove(Objecto);”excluioobjetodobancodedados.Maisa
frente será melhor abordado este assunto.

13.4 O método “public <T extends Object> T find(Class<T> type, Object o);” busca um
objeto vis sua chave primária no banco/cache.

13 - Fazendo import do banco de dados da Aplicação financeira

Observações: A partir deste momento será considerado uma aplicação denominada aplicação
financeira.

13.1 Abra o pgAdmin


13.2 Crie um novo banco de dados denominado AplicacaoFinanceira. Conforme a figura a
seguir.

13.3 Analise o modelo do projeto.


13.4 Selecionar na árvore Databases o banco AplicacaoFinanceira.
13.5 Abrir o arquivo banco de dados application 09 e executá­lo para criar a estrutura do banco de
dados.
13.6 Neste ponto o banco de dados estará criado.

13.8 Conecte­se ao banco AplicacaoFinanceira e faça a geração da camada de entidade pelo
netbeans.

13.10 Faça o import do projeto AplicacaoFinanceira­v09.

Analise as classes Cliente, clienteTemConta

14 Deleção em banco de dados

14.1 Exclua o banco de dados existente

14.2 Faça um import de um novo banco utilizando o arquivo crebas.sql

14.3 Popule as tabelas: estado e cidade


14.4 Abra o Projeto SampleApplication02
14.4.1 Execute o método inserir banco
14.4.2 analise os métodos em execução no main

14.5 Verifique a agencia não foi deletada devido estar no contexto de persistência com
o objeto banco.

14.6 Remova a referencia com o objeto banco. Adicionando o segionte código:

Banco   banco   = agencia.getBanco();
banco.getAgencias().remove(agencia);

14.6.1 Limpe o banco com o script


14.6.2 Execute
14.6.3 Analise os dados da tabela agencia.

14.7 Faça a chamada dos métodos antes de chamar o delete


em.flush();//força sincronização com o banco
em.clear(); //elimina demais objetos do contexto de persistência

14.8 Limpe o banco...


14.9 Execute e verifique que a agencia foi removida.

15 Consultas

Objetivo: conhecer como são feitas consultas utilizando a Java Persistence Query


Language

15.1 Execute as sql´s de deleção


15.2 Verifique os métodos no classe Consultas
15.3 Execute as sql´s de inserção.
15.4 Verifique a classe Consultas

15.5 Palavras chaves em JPQL são case-insensitive, mas entidades, identificadores e


nomes dos membros não.

Mais informações a respeito de consultas na JPQL visite o endereço:


http://docs.oracle.com/cd/E13189_01/kodo/docs40/full/html/ejb3_overview_query.html
16 Teoria Sobre Padrões de Projeto

Objetivo: conhecer padrões de projeto largamente utilizados no desenvolvimento de


sistemas

16.0 Abra o projeto SampleApplication03


16.1 O padrão MVC
16.2 O padrão Facade
16.3 O padrão DAO

Você também pode gostar