Usando Hibernate em uma aplicação JSF Visual Web
Neste tutorial, você usa o NetBeans IDE para criar e implantar uma aplicação Web que exibe dados a partir de um banco de dados. A aplicação Web usa o framework do Hibernate como uma camada de persistência para persistir objetos Java em um banco de dados relacional.
O Hibernate é o framework que fornece ferramentas para o mapeamento relacional de objeto (ORM). O tutorial demonstra como adicionar suporte para o framework do Hibernate ao IDE e criar os arquivos necessários do Hibernate a fim de usar o Hibernate para persistir objetos Java antigos (POJOs). Para obter mais informações sobre o uso do Hibernate, consulte a documentação Hibernate em hibernate.org.
Depois de criar os objetos Java e configurar a aplicação para usar o Hibernate, você adiciona componentes JSF Visual Web a uma página da Web para exibir os dados. Para se familiarizar com o uso de componentes JSF Visual Web, talvez você queira ler a seção Introdução ao desenvolvimento de JSF Visual Web do NetBeans.
Conteúdo
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 |
Componentes do JavaServer Faces/
Plataforma Java EE |
1.2 com Java EE 5* ou
1.1 com J2EE 1.4
|
| Servidor da aplicação GlassFish |
V2 |
| Plug-in do Hibernate |
disponível na Central de atualizações do NetBeans |
| Banco de dados Viagem |
sim |
Adicionando suporte a Hibernate no IDE
Para integrar o suporte para Hibernate no IDE, você precisa instalar os plug-ins do Hibernate disponíveis na Central de atualizações beta do NetBeans. A central de atualizações beta contém dois plug-ins para Hibernate.
- Selecione Ferramentas > Plug-ins no menu principal.
- Na aba Plug-ins disponíveis, selecione os plug-ins seguintes e clique em Instalar.
- Suporte a Hibernate
- Biblioteca do Hibernate 3.2.5
- Percorra o assistente para instalar os plug-ins.
Instalar os plug-ins do Hibernate adiciona suporte para criar arquivos do Hibernate e adicionar bibliotecas do Hibernate aos projetos.
Criando o projeto de aplicação Web
Neste exercício, você criará um projeto JSF Visual Web e anexará as bibliotecas do Hibernate ao projeto. Quando criar o projeto, você selecionará o JSF Visual Web e o Hibernate no painel Frameworks do assistente para Novo projeto. Você também especificará o banco de dados.
- Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione Aplicação Web na categoria Web e clique em Próximo.
- Digite HibernateTravelApp 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 Visual Web.
- Selecione a caixa de verificação Hibernate 3.2.5.
- Use o nome de sessão padrão (session1) e garanta que o banco de dados travel esteja selecionado para a Conexão de banco de dados e a URL da conexão. Clique em Terminar.
Observação: O IDE vem com um banco de dados Travel de amostra e uma conexão pré-configurada ao banco de dados. Se o banco de dados travel não estiver disponível como uma opção no painel Frameworks no assistente, verifique se a conexão está listada no nó Bancos de dados na janela Serviços. Se a conexão não existir, você precisa criar a conexão do banco de dados.
Quando você clicar em Terminar, o IDE cria o projeto de aplicação Web e abre o arquivo hibernate.cfg.xml e Page1 no editor.
Se expandir o nó Bibliotecas na janela Projetos, você pode ver que o IDE adicionou as bibliotecas do Hibernate ao projeto.
Modificando o arquivo de configuração do Hibernate
Quando você cria um novo projeto que usa o framework do Hibernate, o IDE cria automaticamente o arquivo de configuração hibernate.cfg.xml na raiz do classpath do contexto da aplicação (na janela arquivos, WEB-INF/classes). O arquivo está localizado no nó Arquivos de configuração na janela Projetos. O arquivo de configuração contém informações sobre a conexão do banco de dados, os mapeamentos de recurso e outras propriedades da conexão. Você pode editar o arquivo usando o editor de visualização múltipla ou editar o XML diretamente no editor XML.
Neste exercício, você editará as propriedades padrão especificadas em hibernate.cfg.xml para ativar o log de registro para declarações SQL e para ativar o gerenciamento de contexto da sessão do Hibernate.
- Abra hibernate.cfg.xml na aba Design, caso ainda não esteja aberto. Você pode abrir o arquivo expandindo o nó Arquivos de configuração na janela Projetos e clicando duas vezes em hibernate.cfg.xml.
- Expanda o nó Propriedades da configuração em Propriedades opcionais.
- Clique em Adicionar para abrir a caixa de diálogo Adicionar propriedade do Hibernate.
- Na caixa de diálogo, selecione a propriedade hibernate.show_sql e defina o valor para true. Isso permite o registro de depuração das declarações SQL.
-
- Expanda o nó Propriedades de miscelânea e clique em Adicionar.
- Na caixa de diálogo, selecione properties hibernate.current_session_context_class e defina o valor para thread para ativar o gerenciamento de contexto automático da sessão do Hibernate.
Se clicar na aba XML no editor você pode ver o arquivo na visualização XML. O arquivo deve ter uma aparência semelhante a esta:
<hibernate-configuration>
<session-factory name="session1">
<property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/travel</property>
<property name="hibernate.connection.username">travel</property>
<property name="hibernate.connection.password">travel</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
- Salve as alterações feitas no arquivo.
Criando objetos Java
Neste tutorial, você usa objetos Java antigos simples (POJOs), Person e Trip, para representar os dados nas tabelas PERSON e TRIP no banco de dados travel. Cada uma das classes especifica campos das colunas nas tabelas e usa setters e getters simples para recuperar e gravar os dados. Depois de criar as classes, você precisará mapeá-las para as tabelas.
Crie a classe Java Person
- Clique com o botão direito do mouse no nó Pacotes de códigos-fonte na janela Projetos e escolha Novo > Classe Java para abrir o novo assistente para Classe Java.
- No assistente, digite Person para o nome da classe e digite travel para o pacote. Clique em Terminar.
- Faça as seguintes alterações (em negrito) nas classes para implementar a interface serializável e adicionar campos das colunas da tabela.
public class Person implements Serializable {
private int personId;
private String name;
private String jobTitle;
private boolean frequentFlyer;
private java.util.Set trips;
}
- Gere os getters e setters para os campos, clicando com o botão direito do mouse no Editor de código-fonte, escolhendo Inserir código (Alt-Insert) e selecionando Getter e Setter.
- 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 Person e pressionar a barra de espaços para selecionar todos os campos em Person.
- Corrija as importações e salve as alterações.
Criar a classe Java Trip
- Clique com o botão direito do mouse no nó Pacotes de códigos-fonte na janela Projetos e escolha Novo > Classe Java para abrir o novo assistente para Classe Java.
- No assistente, digite Trip para o nome da classe e digite travel para o pacote. Clique em Terminar.
- Faça as alterações seguintes (em negrito) para implementar a interface serializável e adicionar campos das colunas da tabela à classe.
public class Trip implements Serializable {
private int tripId;
private int personId;
private Date depDate;
private String depCity;
private String destCity;
private int tripTypeId;
}
- Gere os getters e setters para os campos, clicando com o botão direito do mouse no Editor de código-fonte, escolhendo Inserir código (Alt-Insert) e selecionando Getter e Setter.
- Na caixa de diálogo Gerar getters e setters, selecione todos os campos e clique em Gerar.
- Corrija as importações e salve as alterações.
Você pode fechar Person.java e Trip.java porque você não precisará editar os arquivos novamente.
Mapeando as classes para as tabelas do banco de dados
Agora que tem classes para representar as tabelas, você precisa mapear cada classe de persistência para a respectiva tabela usando um arquivo de mapeamento do Hibernate. O arquivo de mapeamento é um arquivo XML que contém metadados ORM que define como os campos de classe são mapeados para as colunas da tabela e as chaves primárias. Você criará um arquivo de mapeamento do Hibernate para cada uma dessas classes.
Nesta seção, você usa o assistente para Novo arquivo para criar um arquivo de mapeamento simples.hbm.xml do Hibernate para cada uma das classes. Em seguida, você edita o arquivo no editor XML para mapear os campos em cada classe para a coluna na tabela correspondente e para definir propriedades adicionais. Você pode ajudar auto-completar de código do IDE para ajudá-lo a editar o XML.
Mapeando Person.java para a tabela PERSON
Primeiro, você criará o arquivo de mapeamento do Hibernate Person.hbm.xml para mapear os campos em Person.java para colunas na tabela PERSON.
- Inicie o servidor de banco de dados JavaDB, caso ainda não tenha sido iniciado.
- Na janela Projetos, clique com o botão direito do mouse no nó travel em Pacotes de códigos-fonte e selecione Novo > Outro no menu popup para abrir o assistente para Novo arquivo.
- Selecione Hibernate na lista Categorias e Arquivo de mapeamento do Hibernate na lista Tipos de arquivo. Clique em Próximo.
- Digite Person.hbm para o nome do arquivo e defina a pasta para src/java/travel. Clique em Próximo.
- Digite travel.Person para a Classe a ser mapeada.
Observação: Como alternativa, você pode clicar no botão Explorar e digitar Person na caixa de diálogo Localizar tipo.
- Selecione PERSON na lista suspensa Tabela de banco de dados.
Observação: Se a lista suspensa Tabela de banco de dados estiver vazia, isso provavelmente significa que o banco de dados não está sendo executado. Você pode continuar e criar o arquivo sem especificar a tabela, mas será necessário lembrar-se de fornecer a tabela no XML.
- Clique em Terminar.
Quando você clica em Terminar, o IDE cria o arquivo Person.hbm.xml no mesmo pacote de códigos-fonte que Person.java e abre o arquivo no editor. Por padrão, o arquivo XML tem a seguinte aparência:
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Person" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="PERSON"/>
</hibernate-mapping>
Observação: Se você não conseguiu selecionar a tabela PERSON na lista suspensa quando criou o arquivo, certifique-se de adicionar table="PERSON" ao elemento class.
- No editor XML, faça as seguintes alterações (em negrito) para mapear o id, propriedades e o relacionamento um para muitos.
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
<id column="PERSONID" name="personId">
<generator class="increment"/>
</id>
<property column="NAME" name="name"/>
<property column="JOBTITLE" name="jobTitle"/>
<property column="FREQUENTFLYER" name="frequentFlyer"/>
<set cascade="all-delete-orphan" inverse="true" lazy="true" name="trips" table="TRIP">
<key column="PERSONID"/>
<one-to-many class="travel.Trip"/>
</set>
</class>
</hibernate-mapping>
Você pode usar auto-completar de código no editor XML para ajudá-lo a adicionar propriedades e valores. Se auto-completar de código não estiver funcionando para você como na captura de tela, consulte a observação abaixo.
Observação: Por padrão, o elemento class possui uma marca de fechamento. Como você precisa adicionar elementos de propriedade entre os elementos class de abertura e de fechamento, é preciso fazer as seguintes alterações (em negrito). Depois de fazer as alterações você pode usar auto-completar de código entre os elementos class.
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
</class>
</hibernate-mapping>
- Valide o XML, corrija quaisquer erros de validação e salve seu arquivo.
Mapeando Trip.java para a tabela TRIP
Você agora criará o arquivo de mapeamento do Hibernate Trip.hbm.xml para mapear os campos em Trip.java para colunas na tabela TRIP.
- Na janela Projetos, clique com o botão direito do mouse no nó travel em Pacotes de códigos-fonte e selecione Novo > Outro no menu popup para abrir o assistente para Novo arquivo.
- Selecione Hibernate na lista Categorias e Arquivo de mapeamento do Hibernate na lista Tipos de arquivo. Clique em Próximo.
- Digite Trip.hbm para o nome do arquivo e defina a pasta para src/java/travel. Clique em Próximo.
- Digite travel.Trip para a Classe a ser mapeada.
Observação: Como alternativa, você pode clicar no botão Explorar e ditgitar Trip na caixa de diálogo Localizar tipo.
- Selecione TRIP na lista suspensa Tabela de banco de dados.
Observação: Se a lista suspensa Tabela de banco de dados estiver vazia, então deixe-a em branco aqui. Você pode indicar o nome da tabela no editor XML.
- Clique em Terminar.
Quando você clicar em Terminar, o IDE cria Trip.hbm.xml na mesma pasta como a classe Trip.java e abre o arquivo no editor.
- No editor XML, faça as seguintes alterações (em negrito).
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Trip" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="TRIP">
<id column="TRIPID" name="tripId">
<generator class="increment"/>
</id>
<property column="PERSONID" name="personId"/>
<property column="DEPDATE" name="depDate" type="date"/>
<property column="DEPCITY" name="depCity"/>
<property column="DESTCITY" name="destCity"/>
<property column="TRIPTYPEID" name="tripTypeId"/>
</class>
</hibernate-mapping>
Use auto-completar de código no editor XML para ajudá-lo a adicionar propriedades e valores.
- Valide o XML, corrija quaisquer erros de validação e salve seu arquivo.
Criando a classe Helper do Hibernate
Para usar o Hibernate, você precisa criar uma classe helper que manipula a inicialização e que acesse a SessionFactory Hibernate para obter um objeto Session para que você possa carregar e armazenar objetos Person e Trip. A classe helper primeiro chama Configuration() para carregar o arquivo hibernate.properties. A classe depois chama configure() e carrega o arquivo de configuração hibernate.cfg.xml. Finalmente, a classe helper constrói a SessionFactory para obter o objeto Session.
Nesta seção, você usa o assistente para Novo arquivo a fim de criar a classe helper HibernateUtil.java.
- Clique com o botão direito do mouse no nó do pacote de códigos-fonte travel e selecione Novo > Outro para abrir o assistente para Novo arquivo.
- Selecione Hibernate na lista Categorias e HibernateUtil.java na lista Tipos de arquivo. Clique em Próximo.
- Digite HibernateUtil para o nome da classe. Clique em Terminar.
Ao clicar em Terminar, a classe irá se abrir no editor. Você pode fechar o arquivo porque não precisa editá-lo.
Você agora tem todas as classes da sua aplicação. Se você expandir o nó Pacotes de código-fonte na janela Projetos, seu projeto deve ser parecido com a seguinte captura de tela.
Criando a página JSF Visual Web
Agora que as classes são criadas, você pode criar as páginas da Web para exibir e modificar os dados. Você criará uma página JSP que use o framework JSF e os componenentes JSF Visual Web que você vincula aos dados.
Adicionando os componentes Visual Web JSF à página
- Expanda a pasta Páginas da Web na janela Projetos e abra Page1.jsp no Visual Designer.
- Arraste um componente Lista suspensa do conjunto de componentes Woodstock Basic na paleta e solte-o no canto superior esquerdo de Page1.
- Clique com o botão direito do mouse no componente Lista suspensa e escolha Enviar automaticamente ao alterar no menu pop-up.
Essa ação faz com que o navegador envie a página sempre que o usuário escolhe um novo valor na lista suspensa.
- Clique com o botão direito no mouse novamente no componente Lista suspensa e escolha Adicionar atributo de vinculação.
Observação: Você especificará as vinculações de propriedade mais tarde no tutorial. Vinculação sob demanda dos recursos do NetBeans IDE 6.1. Onde os componentes requerem codificação de Java, você deve adicionar manualmente o atributo de vinculação aos componentes em uma aplicação Visual Web JSF. Para fazê-lo, clique com o botão direito do mouse em cada componente e escolha Adicionar atributo de vinculação. Para obter mais informações, consulte o On-demand Binding Attribute Wiki.
- Arraste e solte um componente Tabela abaixo do componente Lista suspensa.
- Arraste e solte um componente Grupo de mensagens abaixo do componente Tabela.
Os componentes Grupo de mensagens ajudam a diagnosticar problemas de tempo de execução. Por padrão, o componente Grupo de mensagens exibe mensagens sobre erros de tempo de execução, erros de validação e erros de conversão.
- Salve as alterações.
Seua página da Web agora tem os componentes necessários. Você agora precisa vincular os componentes às fontes de dados.
Acessando a fonte de dados de SessionBean1
Você agora precisa editar SessionBean1 para acessar as fontes de dados. Neste exercício, use a caixa de diálogo Adicionar propriedade para especificar os campos em SessionBean1 e para gerar os getters e setters dos campos. O bean de sessão abre um contexto de sessão e recupera os dados por meio dos objetos Java.
- Expanda o pacote de códigos-fonte hibernatetravelapp na janela Projetos e clique duas vezes em SessionBean1.java para abrir o arquivo no editor.
- Coloque o cursor em um espaço vazio no código-fonte (por exemplo, logo após o construtor) e clique com o botão direito do mouse e escolha Inserir código > Adicionar propriedade (Ctrl-I) para abrir a caixa de diálogo Adicionar propriedade.
- Na caixa de diálogo Adicionar propriedade, digite personOptions para o Nome, digite Option[] para o Tipo e selecione private.
- Selecione Gerar getters e setters, caso não esteja selecionada. Clique em OK.
- Repita as etapas para adicionar as seguintes propriedades:
| selectedPersonId |
Inteiro |
| trips4Person |
Trip[] |
- Adicione os métodos buildPersonOptions e updateTrips4Person à classe, adicionadno o seguinte (em negrito) a SessionBean1 após o método getApplicationBean1.
protected ApplicationBean1 getApplicationBean1() {
return (ApplicationBean1) getBean("ApplicationBean1");
}
private void buildPersonOptions() {
List<Person> personList = null;
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Person");
personList = (List<Person>) q.list();
} catch(Exception e) {
e.printStackTrace();
}
personOptions = new Option[personList.size()];
int i=0;
for(Person person : personList) {
Option opt = new Option(person.getPersonId(), person.getName());
personOptions[i++] = opt;
}
}
private void updateTrips4Person() {
if(selectedPersonId == null ) {
trips4Person = new Trip[1];
trips4Person[0] = new Trip();
return;
}
Set personTrips = null;
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Person person = (Person)session.load(Person.class, selectedPersonId);
personTrips = (PersistentSet)person.getTrips();
} catch(Exception e) {
e.printStackTrace();
}
trips4Person = (Trip[]) personTrips.toArray(new Trip[0]);
}
O método buildPersonOptions chama uma consulta na outra fonte de dados Person e armazena os resultados na matriz personOptions. O método updateTrips4Person atualiza as viagens da pessoa selecionada.
- Corrija suas importações.
Observação: Quando você seleciona os nomes totalmente qualificados a serem importados, certifique-se de selecionar as bibliotecas org.hibernatee com.sun.webui.jsf.model.Option e java.util.Set.
- Chame o método buildPersonOptions adicionando o seguinte (em negrito) no fim do método init().
@Override
public void init() {
super.init();
try {
_init();
} catch (Exception e) {
log("SessionBean1 Initialization Failure", e);
throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
}
// Fill in the personOptions[]
buildPersonOptions();
}
- Chame o método updateTrips4Person adicionando o seguinte (em negrito) no fim do método setSelectedPersonId.
public void setSelectedPersonId(Integer selectedPersonId) {
this.selectedPersonId = selectedPersonId;
updateTrips4Person();
}
- Salve as alterações.
- Clique com o botão direito do mouse no nó do projeto na janela Projetos e escolha Construir.
Binding Components to Data
Nesta seção, você vincula os componentes Lista suspensa e Tabela na página da Web às propriedades definidas na seção anterior em SessionBean1.
- Abra Page1.jsp no Visual Designer.
- Clique com o botão direito do mouse no componente Lista suspensa e escolha Vinculações de propriedade para abrir a caixa de diálogo Vinculações de propriedade.
- Selecione items na lista de propriedades vinculáveis e personOptions (no nó SessionBean1) na lista de destino de vinculação. Clique em Aplicar.
- Na mesma caixa de diálogo, selecione selected na lista de propriedades vinculáveis e selectedPersonId (no nó SessionBean1) lista de destino de vinculação. Clique em Aplicar.
- Clique em Fechar para fechar a janela da caixa de diálogo.
- No Visual Designer, clique com o botão direito do mouse no componente Tabela e selecione Layout da tabela.
- Na caixa de diálogo, escolha trips4Person (SessionBean1) na lista suspensa Obter dados de.
Observação: Se você não vir trips4Person (SessionBean1) na lista suspensa, muito provavelmente esqueceu de cosntruir o projeto no fim da seção anterior.
- Selecione personId na lista Selecionado e clique no botão de seta para esquerda para mover o campo da lista Selecionado para a lsita Disponível.
- Use os botões Para cima e Para baixo para organizar os campos restantes na seguinte ordem, como mostrado abaixo, e clique em OK.
- Na barra de ferramentas Edição, clique em Java para abrir Page1.java no Editor Java.
- No método prerender, adicione o código seguinte (em negrito).
public void prerender() {
try {
if (dropDown1.getSelected() == null ) {
Option firstPerson = getSessionBean1().getPersonOptions()[0];
getSessionBean1().setSelectedPersonId((Integer)firstPerson.getValue());
}
} catch (Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
}
O código no método prerender é chamado antes que um navegador Web comece a exibir a página. Adicionar o código ao método prerender faz com que a página exiba as informações da primeira pessoa na lista suspensa quando o usuário visita a página pela primeira vez.
Quando o navegador solicita a página pela primeira vez, a aplicação cria uma instância de Page1 e chama o método prerender. O servidor envia a resposta (a página HTML) e a instância de Page1 é eliminada. A aplicação não chama o manipulador de eventos de alteração de valor porque a aplicação gera eventos de alteração de valor somente quando um página é enviada (neste caso, quando uma nova pessoa é selecionada).
- Clique com o botão direito do mouse no código-fonte e escolha Corrigir importações no menu popup para abrir a caixa de diálogo Corrigir importações. Na lista suspensa Nome totalmente qualificado, selecione com.sun.webui.jsf.model.Option, como mostrado abaixo.
- Salve as alterações.
Executando o projeto
Clique em Executar projeto principal na barra de ferramentas principal.
O IDE salva todos os arquivos alterados, reconstrói e reimplanta o aplicativo no servidor.
- Selecione uma pessoa na lista suspensa para ver como os conteúdos da tabela são atualizados com os dados da pessoa selecionada.
Consulte também