Tutorial Persistência Java no Java EE 5
Este documento guia você pelos fundamentos do desenvolvimento de uma aplicação Web usando Persistência Java™. A API de persistência Java foi introduzida como parte da plataforma Java EE 5. Neste tutorial, você irá criar um projeto simples de aplicativo da Web. Embora vamos usar persistência em nosso projeto, a API de persistência Java permite-nos usar persistência sem precisar criar um módulo EJB.
Usar persistência Java em seu projeto simplifica tremendamente o desenvolvimento, removendo a necessidade de configurar os descritores de deployment para fornecer informações de mapeamento de objeto relacional para campos ou propriedades persistentes. Em vez disso, você pode usar anotações para definir essas propriedades diretamente em uma classe Java simples.
A persistência de entidade é gerenciada pela API EntityManager. A API EntityManager manipula o contexto de persistência, e cada contexto de persistência é um grupo de instâncias de entidade. Ao desenvolver sua aplicação, você pode usar anotações em sua classe para especificar a instância do contexto de persistência das suas instâncias de entidade. O ciclo de vida das instâncias da entidade é então manipulada pelo contêiner.
Este documento usa a versão NetBeans IDE 6.1.
Duração esperada: 15 minutos
Exercícios do tutorial
Para seguir este tutorial, você precisa dos seguintes recursos e softwares.
| NetBeans IDE |
Web e Java EE, versão 6.1 |
| Java Development Kit (JDK) |
versão 6 ou
versão 5 |
| Servidor da aplicação GlassFish |
V2 |
Para este tutorial, é necessário registrar uma instância local do servidor da aplicação GlassFish/Sun Java System com o IDE. O servidor da aplicação GlassFish é incluído no IDE. Se você instalou o servidor da aplicação como uma opção quando instalou o IDE, o servidor já deve estar registrado no IDE.
Pré-requisitos
Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir, ou alguma experiência de programação com elas:
- Programação em Java
- NetBeans IDE
Configurando o projeto de aplicação Web
O objetivo deste exercício é criar um novo projeto da aplicação Web ZooApp. Essa aplicação irá tirar vantagem dos recursos do modelo de persistência Java. Um dos recursos é que esses objetos de entidade podem ser classes Java simples, de forma que não precisem mais ser colocadas em um módulo EJB e empacotados em um arquivo EAR. Isso significa que você pode criar nossas classes de entidade dentro de uma aplicação Web.
Para este tutorial você usará formulários em páginas JavaServer Faces (JSF) para ler e modificar os dados no banco de dados.
- Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione Aplicação Web na categoria Web e clique em Próximo.
- Digite ZooApp para o nome do projeto e defina a localização do projeto.
- Desmarque a opção Usar pasta dedicada, se ela estiver selecionada.
(Para este tutorial, não há motivo para copiar as bibliotecas do projeto para uma pasta dedicada porque você não precisará compartilhar bibliotecas com outros usuários.)
Clique em Próximo.
- Defina o servidor como GlassFish e defina a versão de Java EE Java EE 5. Clique em Próximo.
- Selecione a caixa de verificação JavaServer Faces e clique em Terminar.
Resumo
Neste exercício, você criou uma aplicação Web Java EE 5 que conterá as classes de entidade.
Criando uma unidade de persistência
Neste exercício, você criará uma unidade de persistência para informar ao contêiner quais classes de entidade são gerenciadas pelo gerenciador de entidades, e também a fonte de dados usada por essas entidades.
Você cria a unidade de persistência, definindo suas propriedades em persistence.xml que você criará no módulo Web. Depois de especificar o nome da unidade de persistência, você especificará o provedor de persistência que o contêiner usa para gerenciar instâncias de entidade. Você também precisa especificar as fontes de dados e uma estratégia de geração de tabelas. Você criará a unidade de persistência, usando o assistente para Nova unidade de persistência.
Você também pode criar uma unidade de persistência no assistente para Nova classe de entidade. Quando você criar uma classe de entidade, o assistente solicitará que você crie uma unidade de persistência caso ainda não exista uma.
Criando uma unidade de persistência
- Clique com o botão direito do mouse no da aplicação Web ZooApp na janela Projetos e escolha Novo > Outro para abrir o assistente para Novo arquivo.
- Na categoria Persistência, selecione Unidade de persistência e clique em Próximo.
- Preserve o nome da unidade de persistência padrão.
- Para o Provedor de persistência, use TopLink (default).
O provedor padrão é o TopLink Essential.jar. TopLink Essential.jar contém as bibliotecas da persistência Java. Nosso gerenciador de entidade se encontra em TopLink Essential.jar.
- Para Fonte de dados, use a fonte de dados padrão jdbc/sample.
A fonte de dados jdbc/sample já está configurada para conectar o banco de dados Java DB incluído no servidor da aplicação GlassFish. Você pode usar outro banco de dados, se criar uma fonte de dados para o banco de dados.
- Verifique se a unidade de persistência está usando a API de transação de Java e se a Estratégia de geração de tabela está definida como Criar, de modo que as tabelas baseadas nas classes de entidade sejam criadas quando a aplicação for implantada.
- Clique em Terminar.
Ao clicar em Terminar, o IDE cria persistence.xml e o abre no Editor de código-fonte na exibição Design. Você pode clicar em XML na barra de ferramentas do editor de código-fonte para ver o XML de persistence.xml. Esse arquivo contém as informações que o contêiner Java EE 5 precisa para gerenciar as entidades e a persistência do aplicativo.
Resumo
Neste exercício, você criou uma unidade de persistência para especificar a fonte de dados, as classes de entidade a serem persistidas e o gerenciador de entidades que o contêiner usará para gerenciar o ciclo de vida das entidades.
Criando as classes de entidade
Neste exercício, você criará duas classes de entidade, Animal.java e Pavilion.java, que representam as tabelas no banco de dados relacional que você deseja criar. Em seguida, você irá definir alguns campos nas classes para representar os dados. A especificação Persistência Java permite que você use anotações para fornecer informações para o contêiner sobre os campos, tais como informações de mapeamento de objeto relacional.
Criando a classe de entidade Animal e Pavilion
Primeiro, você criará as classes de entidade Animal e Pavilion. As classes representam as tabelas ANIMAL e PAVILION no banco de dados.
Quando você cria a classe de entidade, o IDE adiciona a anotação @Entity para definir a classe como uma classe de entidade. Depois de criar a classe, você criará os campos na classe para representar os dados que deseja em sua tabela, e usará anotações para fornecer informações adicionais sobre alguns dos campos.
Cada classe de entidade deve ter uma chave primária. Quando você cria a classe de entidade, o IDE adiciona a anotação @Id para declarar o campo a ser usado como chave primária. O IDE também adiciona a anotação @Generated para especificar a estratégia de geração de chave para o Id primário.
Para criar as classes de entidade, faça o seguinte:
- Clique com o botão direito do mouse no nó do projeto ZooApp e escolha Novo > Outro.
- Na categoria Persistência, selecione Classe de entidade e clique em Próximo.
- Digite Animal para o nome da classe, digite entity para o pacote e deixe o Tipo de chave primária como Long. Clique em Terminar.
- Repita as etapas acima para criar a classe Pavilion no pacote de códigos-fonte entity.
Quando você clica em Terminar, as novas classes de entidade se abrem no editor. Se expandir o nó entity sob Pacotes de códigos-fonte na janela Projetos, você pode ver que as classes de entidade Animal e Pavilion estão lá.
Definindo os campos na classe Animal
Abra a classe Animal no editor e faça o seguinte:
- Adicione as seguintes declarações de campo à classe (em negrito):
public class Animal implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String kind;
private String weight;
private Pavilion pavilion;
- Clique com o botão direito do mouse no Editor de código-fonte e escolha Inserir código (Alt-Insert) e, em seguida, selecione Getter e Setter para abrir a caixa de diálogo Gerar getters e setters.
- Na caixa de diálogo Gerar getters e setters, selecione todos os campos e clique em Gerar.
Na caixa de diálogo Gerar getters e setters, você pode usar a seta para cima no teclado para mover o item para o item Animal e pressionar a barra de espaços para selecionar todos os campos em Animal.
- Agora você deseja alterar o nome das colunas que serão criadas na tabela Animal de forma que a coluna seja chame animalName em vez de name. Você pode usar anotações para especificar o nome da coluna gerada, adicionando a anotação seguinte acima da declaração do campo name:
@Column(name="animalName")
private String name;
- Quando você anotou o campo name com a anotação @Column, o IDE exibiu um aviso na margem esquerda ao lado do identificador da classe. Clique no ícone de aviso na margem e selecione Unificar acesso do campo.
Quando você clica em Unificar acesso do campo, o IDE move as anotações @Id e @GeneratedValue do getter getId
de forma que as anotações agora fiquem diretamente sobre private Long id.
- A coluna pavilion em nossa tabela Animal também deve ter uma relação muitos para um. Você pode fazer isso usando anotações, adicionando a anotação seguinte acima da declaração pavilion:
@ManyToOne
private Pavilion pavilion;
- Pressione Alt-Shift-I para gerar as instruções de importação necessárias para a classe.
- Salve as alterações.
Na próxima etapa definiremos os campos na classe de entidade Pavilion.
Definindo os campos na classe Pavilion
Abra a classe Pavilion no editor e faça o seguinte:
- Adicione as seguintes declarações de campo à classe (em negrito):
public class Pavilion implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String address;
private Collection <Animal> animals;
- Adicione a seguinte anotação acima da declaração name para alterar o nome da coluna gerada:
@Column(name="pavilionName")
private String name;
- Adicione a notação seguinte acima da coleção animals para especificar uma relação Um para muitos para a entrada:
@OneToMany(mappedBy="pavilion")
private Collection <Animal> animals;
- Clique com o botão direito do mouse no editor e escolha Inserir código (Alt-Insert) e, em seguida, selecione Getter e setter.
- Na caixa de diálogo Gerar getters e setters, selecione todos os campos e clique em Gerar.
- Clique no ícone de aviso na margem e em unificar acesso do campo como fez para a classe Animal.
- Pressione Alt-Shift-I para gerar quaisquer instruções de importação ausentes.
- Salve as alterações.
Resumo
Neste exercício, você criou duas classes de entidade e definiu campos. Você também usou anotações para definir as propriedades de algumas das colunas nas tabelas que serão geradas quando você implantar o aplicativo.
Criando um projeto da Web
Agora você precisa criar algumas páginas da Web simples para ver se as tabelas do banco de dados foram criadas e se você pode adicionar dados. Você adicionará páginas Java Server Faces (JSF) à aplicação e usará as JSF Pages do assistente para Classe de entidade para criar rapidamente uma interface da Web simples.
- Escolha Arquivo > Novo no menu principal. Selecione JSF Pages em Classe de entidade na categoria Persistência e clique em Próximo.
- Nas Novas páginas JSF do assistente para Classe de entidade, clique em Adicionar tudo para selecionar duas classes de entidade e clique em Próximo.
- Deixe o campo de texto Pasta de páginas JSF vazio para salvar os arquivos JSF na localização padrão.
- Especifique entity como o pacote das classes geradas e clique em Terminar.

Quando você clica em Terminar, o IDE gera os arquivos JavaServer Faces necessários de forma que você possa executar e testar ZooApp.
Executando o projeto
Neste exercício, você implantará o projeto de aplicação Web ZooApp e testar a aplicação.
- Inicie o banco de dados Java DB, clicando com o botão direito do mouse no nó JavaDB na janela Serviços e escolhendo Iniciar servidor.
- Clique com o botão direito do mouse no nó do projeto ZooApp e escolha Executar projeto.
Quando você clica em Executar, a página se abre em seu navegador com um menu que permite ver uma lista dos pavilions e animals.
Você pode clicar nos links para visualizar, adicionar, editar ou excluir os dados de animals e pavilions.
Resumo
Neste exercício, você construiu a aplicação Web ZooApp que desenvolveu para a plataforma Java EE 5. Em seguida, você implantou e testou a aplicação Web ZooApp.
Solução de problemas
Seguem-se alguns problemas que você poderá encontrar ao criar o projeto.
Problema com o assistente para Novas páginas JSF de classe de entidade
Quando usa o assistente para criar páginas JSF a partir de uma classe de entidade, talvez você veja a seguinte mensagem de erro no assistente:
Este assistente pode ser utilizado somente em um projeto da Web com suporte a JSF.
Se você vir essa mensagem, precisará verificar se o framework Java Server Faces foi adicionado às propriedades do projeto. Você pode adicionar o suporte a Java Server Faces em seu projeto da Web, fazendo o seguinte:
- Clique com o botão direito do mouse no nó do projeto de aplicação Web na janela Projetos e selecione Propriedades.
- Selecione Frameworks no painel Categorias da caixa de diálogo Propriedades do projeto e clique em Adicionar.
- Na caixa de diálogo Selecionar frameworks, selecione Java Server Faces e clique em OK.
- Clique em OK na caixa de diálogo Propriedades do projeto para fechar a janela.
Depois de adicionar o framework JSF às propriedades do projeto, você deve ser capaz de criar as páginas JSF usando o assistente.
Ao modificar os dados de Pavilion você obtém IllegalArgumentException
Se você vir as categorias seguintes:
java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(animals). Found null.
o problema é causado provavelmente pelos métodos getter e setter incorretos para Coleção <Animal> na classe Pavilion.
Certifique-se de que os getters e setters de Coleção <Animal> se parecem com o seguinte:
public Collection<Animal> getAnimals() {
return animals;
}
public void setAnimals(Collection<Animal> animals) {
this.animals = animals;
}
Se os getters e setters não estiverem corretos em seu projeto, façam o seguinte:
- Exclua as classes Controller e Converter das classes de entidade.
- Exclua os diretórios animal e pavilion sob o nó Páginas da Web na janela Projetos.
- Corrija os getters e setters na classe de entidade Pavilion.
- Use o assistente para Páginas JSF de classe de entidade para regerar as classes Controllers e Converter das páginas JSF.
Próximas etapas
Para obter mais informações sobre o uso do NetBeans IDE 5.5 para desenvolver aplicações Java EE, consulte os seguintes recursos:
Você pode encontrar informações sobre o uso da persistência Java no Tutorial do Java EE 5.
Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos dos recursos de desenvolvimento do Java EE do NetBeans IDE, inscreva-se na lista de endereçamento de nbj2ee.