Aplicação Hibernate1 no NetBeans Hibernate é um framework que fornece ferramentas para efetuar o mapeamento objeto/relacional para Java. Mapeamento objeto/relacional é o processo de conversão bidirecional entre objetos e tabelas de um modelo relacional. Este projeto Hibernate1 mostra o suporte incluído no NetBeans para o framework Hibernate que inclui wizards para criar os ficheiros Hibernate necessários para configuração da aplicação e para o mapeamento dos objetos Java. Este projeto usa o servidor de base de dados incluído no NetBeans “Java DB” (também designado Derby). 1. Iniciar o servidor de base de dados Derby, criar uma base de dados (“DB1”) com uma tabela (“Pessoa”). NetBeans Iniciar o servidor de base de dados “Java DB” o separador Services o expandir Databases o bt dir. rato em “Java DB”, selecionar Start Server (se já foi iniciado estará desactivado). Criar a base de dados “DB1” o bt dir. rato em “Java DB”, selecionar Create Database… Database Name: DB1 User Name: user1 Password: pass1 OK Criar a tabela “Pessoa” o Efetuar a ligação à base de dados “DB1” expandir Drivers bt dir. rato em “jdbc:derby://localhost:1527/DB1 [user1 on USER1]”, selecionar Connect… o Criar a tabela “Pessoa” bt dir. rato em “jdbc:derby://localhost:1527/DB1 [user1 on USER1]”, selecionar Execute Command… escrever na janela Source: create table pessoa (id int, nome VARCHAR(20)) bt dir. rato na janela Source, selecionar Run Statement… o Verificar a base de dados Duplo clique em “jdbc:derby://localhost:1527/DB1 [user1 on USER1]” Expandir USER1, Tables bt dir. rato em Tables, selecionar Refresh bt dir. rato na tabela Pessoa, selecionar View Data… (a tabela está vazia). Na janela Source surge a instrução “Select * From USER1.Pessoa” e abaixo a tabela com o resultado. o Nota ‐ comando para apagar a tabela pessoa: drop table pessoa 2. Criar a aplicação Hibernate1 para gravar objectos Pessoa na base de dados através do Hibernate Criar um projecto NetBeans o Files > New Project > Java, Java Application > Next Project Name: Hibernate1 Finish Criar a classe “Pessoa” o bt dir. rato no package hibernate1, selecionar New > Java Class… Class Name: Pessoa Location: Source Packages Package: hibernate1 Finish A classe tem de implementar o interface Serializable: public class Pessoa implements java.io.Serializable { . . . Escrever os campos de dados (variáveis de instância): private int id; private String nome; bt dir. rato na janela Source, em qualquer ponto do código da classe Pessoa, seleccionar Insert Code… o Constructor > Generate (gera construtor sem argumentos) o Constructor > marcar os 2 campos de dados > Generate o Getter and Setter… > marcar a classe Pessoa > Generate Adicionar suporte Hibernate ao Projeto. Para adicionar suporte Hibernate é necessário adicionar a biblioteca Hibernate ao projecto. O IDE NetBeans inclui a biblioteca Hibernate. Mas como vamos criar os ficheiros de configuração Hibernate usando wizards, o IDE automaticamente adicionará a biblioteca Hibernate ao projecto. No entanto esta biblioteca poderia ser adicionada clicando com o botão direito do rato no nó Libraries na janela Projects, seleccionando “Add Library” e depois seleccionando a biblioteca Hibernate na caixa de diálogo. Expandindo o nó Libraries na janela Projects podemos verificar que a biblioteca Hibernate ainda não foi adicionada. Criar o ficheiro de configuração Hibernate (hibernate.cgf.xml). Para cada aplicação devemos criara um ficheiro de configuração Hibernate com informação acerca da ligação à base de dados, mapeamento de recursos, e outras propriedades da ligação. Através do wizard selecionámos o objecto connection de ligação à base de dados a partir de uma lista de objectos connection registados no IDE. O IDE ao gerar o ficheiro de configuração adiciona automaticamente os detalhes da ligação e informação do dialeto com base no objecto connection seleccionado. O IDE também adiciona automaticamente a biblioteca Hibernate ao projecto. o bt dir. rato no nó Source Packages na janela Projects, selecionar New > Other… o seleccione Categories: Hibernate e File Types: Hibernate Configuration Wizard. File Name: hibernate.cfg Folder: src o Next Select Data Source: Database Connection: jdbc:derby://localhost:1527/DB1 [user1 on USER1] Database Dialect: org.hibernate.dialect.DerbyDialect Finish Alterar o ficheiro de configuração Hibernate (hibernate.cgf.xml) para mostrar os comandos SQL gerados pelo Hibernate. o o o o o o Abrir o ficheiro hibernate.cfg.xml no modo Design. Expandir o nó Configuration Properties debaixo de Optional Properties Clicar no botão Add Seleccione a propriedade hibernate.show_sql e coloque o valor true. Ok. Gravar o ficheiro. O seguinte elemento é adicionado ao ficheiro hibernate.cfg.xml: <property name="hibernate.show_sql">true</property> Criar o ficheiro de mapeamento para a classe Pessoa. Os dados de um objecto Pessoa vão constituir um registo da tabela Pessoa. Para mapear a classe Pessoa na tabela PESSOA podemos usar um ficheiro de mapeamento Hibernate ou anotações na classe Pessoa. O wizard Hibernate Mapping Wizard cria um ficheiro de mapeamento baseado na tabela da base de dados especificada. Um ficheiro de mapeamento pode conter informação de mapeamento de muitas classes, mas é uma boa prática ter um ficheiro de mapeamento separado para cada classe. o bt dir. rato no nó hibernate1 na janela Projects, selecionar New > Other… o seleccione Categories: Hibernate e File Types: Hibernate Mapping Wizard. File Name: hibernate.hbm => Pessoa.hbm Folder: src/hibernate1 Next o Select Mapping Class: Class to Map: Premir … Escrever Pessoa Selecionar a classe Ok. Class to Map: hibernate1.Pessoa Configuration File: hibernate.cfg.xml Database Table: PESSOA Finish o Mapeamento dos campos de dados da classe Pessoa nas colunas da tabela PESSOA. Alterar o elemento <class> de: <class name="hibernate1.Pessoa" table="PESSOA"/> para <class name="hibernate1.Pessoa" table="PESSOA"> <id name="id" type="int"> <generator class="increment"/> </id> <property name="nome" column="nome" type="string"/> </class> Clicar no botão Validate XML e gravar as alterações. O IDE também adiciona automaticamente uma entrada para este recurso de mapeamento ao ficheiro hibernate.config.xml. o <mapping resource="hibernate1/Pessoa.hbm.xml"/> Criar o ficheiro auxiliar HibernateUtil.java. Para usar Hibernate é útil criar uma classe auxiliar para ter acesso a um objecto SessionFactory. O método configure() carrega o ficheiro de configuração hibernate.cfg.xml e constrói o objecto SessionFactory. o bt dir. rato no nó hibernate1 na janela Projects, selecionar New > Other… o seleccione Categories: Hibernate e File Types: HibernateUtil.Java, Next. Class Name: NewHibernateUtil => HibernateUtil Location: Source Packages Finish Código gerado: package hibernate1; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from standard // config file (hibernate.cfg.xml). sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (Throwable ex) { // Log the exception. System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } Criar o método main() da classe de arranque Hibernate1. Classe Hibernate1.java: package hibernate1; import import import import org.hibernate.HibernateException; org.hibernate.Session; org.hibernate.SessionFactory; org.hibernate.Transaction; public class Hibernate1 { public static void main(String[] args) { // Cria os objetos SessionFactory e Session SessionFactory factory = HibernateUtil.getSessionFactory(); Session session = factory.openSession(); // Realiza as operações debaixo de uma transação Transaction tx = null; try { tx = session.beginTransaction(); // Cria um objeto Pessoa e grava-o na base de dados – save() Pessoa p1 = new Pessoa(); p1.setNome("Jorge Silva"); session.save(p1); // Cria outro objeto Pessoa e grava-o Pessoa p2 = new Pessoa(); p2.setNome("Isabel Araujo"); session.save(p2); // Retribui os objetos Pessoa Pessoa pessoa = (Pessoa) session.get(Pessoa.class, p1.getId()); System.out.println("Primeira pessoa = " + pessoa.getNome()); pessoa = (Pessoa) session.get(Pessoa.class, p2.getId()); System.out.println("Segunda pessoa = " + pessoa.getNome()); tx.commit(); tx = null; } catch ( HibernateException e ) { if ( tx != null ) tx.rollback(); e.printStackTrace(); } finally { session.close(); } } } Saída produzida: Hibernate: select max(id) from PESSOA Primeira pessoa = Jorge Silva Segunda pessoa = Isabel Araujo Hibernate: insert into PESSOA (nome, id) values (?, ?) Hibernate: insert into PESSOA (nome, id) values (?, ?)