O Hibernate ORM permite aos desenvolvedores escrever mais facilmente as aplicações cujos dados sobrevivem ao processo da aplicação. Como um framework Object/Relational Mapping (ORM), o Hibernate está preocupado com a persistência de dados que se aplica aos bancos de dados relacionais via JDBC. Entretanto tenha em mente que utilizar dados em Java é complicado, a maneira como você acessa dados em Java é fundamentalmente diferente da maneira de fazê-lo em um banco de dados relacional. Em Java, você pode navegar de uma associação à um outro nível da rede de objetos. No entanto esta não é uma forma eficiente de recuperar dados de um banco de dados relacional. Você normalmente quer minimizar o número de consultas SQL e assim carregar várias entidades através de associações e selecionar as entidades visadas antes de começar a andar pela rede de objetos.
O Hibernate ORM ajuda de um modo eficiente seu aplicativo alcançar a persistência. Então, Persistência significa simplesmente que nós gostaríamos de que os dados do aplicativo possa sobreviver ao processo de aplicações. Em termos de Java, gostaríamos que o estado de (alguns) dos nossos objetos vivam além do âmbito da JVM para que o mesmo estado esteja disponível mais tarde, ou seja para isto precisamos grava-los e manipula-los em um banco de dados.
Hibernate: http://hibernate.org/
Persistindo Dados no Oracle Database com o Hibernate ORM
1 – Crie uma aplicação web dinâmica JSF com duas páginas XHTML uma de nome index.xhtml e outra de resultado.xhtml. Baixe a ultima versão do framework Hibernate ORM e o descompacte em uma pasta. No Eclipse nas propriedades do projeto em Build Path clique em Add Library, escolha User Library e clique em Next:
2 – Clique no botão User Library para adicionar uma nova biblioteca:
3 – Clique em New e crie um nome para sua biblioteca, geralmente Hibernate adicionado de sua versão:
4 – Clique em sua biblioteca e adicione os Jars externos localizados na pasta lib/required do Hibernate:
5 – Com a biblioteca criada, confirme todas as janelas:
6 – Repita o mesmo processo acima para adicionar o Driver JDBC da Oracle, neste exemplo utilizamos a biblioteca chamada ojdbc7.jar contida na pasta JDBC\lib do Client do Oracle 12c:
7 – Nas propriedades do projeto adicione as bibliotecas incluídas no projeto ao servidor de aplicação, para fazer isto vá na opção Deployment Assembly e inclua as duas bibliotecas acima ao Deployment, isto fará com que o servidor de aplicação use as bibliotecas à partir da pasta WEB-INF/Lib:
8 – Este projeto foi escrito sobre o Pattern J2EE conhecido como DAO, neste caso um projeto mesmo simples necessita de varias classes e de um Pattern auxiliar para a conexão com o banco de dados chamado Factory Method, deste modo o projeto separa suas partes distintas. Utilize a figura abaixo na janela Project Explorer para se orientar sobre a estrutura das packages, classes e arquivos de configuração requeridos:
9 – Após acrescentar todos os códigos abaixo a cada respectivo arquivo, rode a aplicação. Você pode perceber que o Design Pattern DAO, nos possibilita separar a camada de dados, das regras de negocio e da interface com o usuário. Preencha os dados e clique em enviar para que o Hibernate ORM persista os dados no bando de dados Oracle Database:
10 – Assim que os dados são inseridos uma página exibira o resultado:
Exemplo:
Neste exemplo utilizamos o framework de persistência Hibernate ORM para gravar dados no Oracle Database, através de uma aplicação JSF e o servidor de aplicação Apache Tomcat.
Obs: Caso queira saber como utilizar a persistência do framework Hibernate e o Oracle Database através de projetos utilizando o Apache Maven clique aqui.
Oracle – SQL
-- Desenvolvimento Aberto - Oracle -- Cria Sequence CREATE SEQUENCE SEQ_PARTICIPANTE START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- Cria tabela e PK CREATE TABLE PARTICIPANTE ( ID_PART INTEGER NOT NULL , NOME VARCHAR2(30) NOT NULL , SOBRENOME VARCHAR2(70) NOT NULL , CARGO VARCHAR2(30) NOT NULL , DATA_ADMISSAO DATE NOT NULL , SALARIO NUMBER(9,2) NOT NULL , GENERO VARCHAR2(20) NOT NULL , ATIVO CHAR(5) NOT NULL , OBSERVACAO VARCHAR2(255) , CONSTRAINT PARTICIPANTE_PK PRIMARY KEY ( ID_PART ) ENABLE );
Java
org.desenvolvimento.aberto
Participante
package org.desenvolvimento.aberto; import java.util.Date; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import org.desenvolvimento.aberto.Modelo.ParticipanteModelo; import org.desenvolvimento.aberto.dao.ParticipanteDao; // Define decoradores @ManagedBean(name = "Participante") @SessionScoped public class Participante { // Define atributos privados private long id; private String nome; private String sobrenome; private String cargo; private Date data; private double salario; private String genero; private boolean ativo; private String observacao; // Metodos Getter e Setter public long getId() { return id; } public void setId(long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getSobrenome() { return sobrenome; } public void setSobrenome(String sobrenome) { this.sobrenome = sobrenome; } public String getCargo() { return cargo; } public void setCargo(String cargo) { this.cargo = cargo; } public Date getData() { return data; } public void setData(Date data) { this.data = data; } public double getSalario() { return salario; } public void setSalario(double salario) { this.salario = salario; } public String getGenero() { return genero; } public void setGenero(String genero) { this.genero = genero; } public boolean isAtivo() { return ativo; } public void setAtivo(boolean ativo) { this.ativo = ativo; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } // Grava Dados usando Hibernate // Você pode criar um modelo de dados para este Managed Bean // Optamos por usar o próprio objeto através da referencia This public String enviarDados() { // Cria objeto DAO ParticipanteDao participante = new ParticipanteDao(); // cria objeto Modelo ParticipanteModelo modelo = new ParticipanteModelo(); // Transfere dados ao objeto modelo.setNome(this.getNome()); modelo.setSobrenome(this.getSobrenome()); modelo.setCargo(this.getCargo()); modelo.setData(this.getData()); modelo.setSalario(this.getSalario()); modelo.setGenero(this.getGenero()); modelo.setAtivo(String.valueOf(this.isAtivo())); modelo.setObservacao(this.getObservacao()) ; // Você pode criar boolean resultado = participante.insereDados(modelo); // Verifica resultado if (resultado){ return "resultado.xhtml?faces-redirect=true"; } else { return null; } } }
org.desenvolvimento.aberto.dao
IParticipanteDao
package org.desenvolvimento.aberto.dao; import org.desenvolvimento.aberto.Modelo.ParticipanteModelo; public interface IParticipanteDao { // Define método abstrato boolean insereDados(ParticipanteModelo participante); }
ParticipanteDao
package org.desenvolvimento.aberto.dao; import org.hibernate.Session; import org.desenvolvimento.aberto.Factory.*; import org.desenvolvimento.aberto.Modelo.ParticipanteModelo; public class ParticipanteDao implements IParticipanteDao { @Override public boolean insereDados(ParticipanteModelo participante) { // Declara variável de resultado int resultado = 0; // Cria sessão Session session = DBConexaoFactory.getSessionFactory().openSession(); // Cria transação session.beginTransaction(); // Persiste dados resultado = (Integer) session.save(participante); // Confirma e encerra transação session.getTransaction().commit(); // Retorna resultado if (resultado != 0) { return true; } else { return false; } } }
org.desenvolvimento.aberto.Factory
DBConexaoFactory
package org.desenvolvimento.aberto.Factory; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class DBConexaoFactory { private static final SessionFactory sessionFactory = buildSessionFactory(); // Constroi sessão @SuppressWarnings("deprecation") private static SessionFactory buildSessionFactory() { try { // buildSessionFactory não será utilizado em versões superiores // Veremos outros métodos para criar um Factory // Não é necessário incluir o "hibernate.cfg.xml" no configure() // Incluímos somente a nível de fácil entendimento da chamada da // configuração. // Você pode retirar a chamada. return new Configuration().configure("hibernate.cfg.xml") .buildSessionFactory(); } catch (Throwable ex) { // Em caso de erro System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } // Retorna Factory da sessão public static SessionFactory getSessionFactory() { return sessionFactory; } // Encerra Sessão public static void shutdown() { getSessionFactory().close(); } }
org.desenvolvimento,aberto.Modelo
package org.desenvolvimento.aberto.Modelo; import java.util.Date; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Entity; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Entity @Table(name = "PARTICIPANTE") public class ParticipanteModelo { // Define atributos privados @Id @GeneratedValue(strategy=GenerationType.AUTO, generator="SEQ_PARTICIPANTE") @SequenceGenerator(name="SEQ_PARTICIPANTE", sequenceName="SEQ_PARTICIPANTE") @Column(name = "ID_PART") private int id; @Column(name = "NOME") private String nome; @Column(name = "SOBRENOME") private String sobrenome; @Column(name = "CARGO") private String cargo; @Column(name = "DATA_ADMISSAO") private Date data; @Column(name = "SALARIO") private double salario; @Column(name = "GENERO") private String genero; @Column(name = "ATIVO") private String ativo; @Column(name = "OBSERVACAO") private String observacao; // Metodos Getter e Setter public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getSobrenome() { return sobrenome; } public void setSobrenome(String sobrenome) { this.sobrenome = sobrenome; } public String getCargo() { return cargo; } public void setCargo(String cargo) { this.cargo = cargo; } public Date getData() { return data; } public void setData(Date data) { this.data = data; } public double getSalario() { return salario; } public void setSalario(double salario) { this.salario = salario; } public String getGenero() { return genero; } public void setGenero(String genero) { this.genero = genero; } public String getAtivo() { return ativo; } public void setAtivo(String ativo) { this.ativo = ativo; } public String getObservacao() { return observacao; } public void setObservacao(String observacao) { this.observacao = observacao; } }
Resources – application.properties
# -- welcome -- welcomeTitle=Desenvolvimento Aberto requerido.nome=O campo nome é obrigátorio. requerido.sobrenome=O campo sobrenome é obrigátorio. requerido.cargo=O campo cargo é obrigátorio. requerido.data=O campo data de admissão é obrigátorio. requerido.genero=O campo genero é obrigátorio. requerido.salario =O campo salário é obrigatório. validar.salario =O salário não pode ser menor que o valor minimo atual.
Configuração – hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> <property name="hibernate.connection.username">user</property> <property name="hibernate.connection.password">pass</property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property> <property name="hibernate.current_session_context_class">thread</property> <mapping class="org.desenvolvimento.aberto.Modelo.ParticipanteModelo" /> </session-factory> </hibernate-configuration>
JSF – Java Server Faces
index.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <f:loadBundle basename="resources.application" var="msg" /> <head> <title><h:outputText value="#{msg.welcomeTitle}" /></title> </head> <h:body> <h2>JSF - Desenvolvimento Aberto - Managed Beans -</h2> <h3> <h:outputText id="lnome" value="Java Server Faces- Elementos de Formulário - Hibernate - Oracle Database" /> </h3> <h:form> <fieldset style="padding: 10px"> <legend style="padding: 5px">Cadastro:</legend> <h:panelGrid columns="3" cellpadding="2px"> <h:outputText id="lnome" value="Nome:" /> <h:inputText id="tnome" value="#{Participante.nome}" size="30" required="true" label="Nome" requiredMessage="#{msg['requerido.nome']}"> <f:validateRegex pattern="[a-zA-Z]+" /> </h:inputText> <h:message for="tnome" style="color:red" /> <h:outputText id="lsobrenome" value="Sobrenome:" /> <h:inputText id="tsobrenome" value="#{Participante.sobrenome}" size="40" required="true" label="Sobrenome" requiredMessage="#{msg['requerido.sobrenome']}"> <f:validateRegex pattern="[a-zA-Z]+" /> </h:inputText> <h:message for="tsobrenome" style="color:red" /> <h:outputText id="lcargo" value="Cargo" /> <h:selectOneMenu id="tcargo" style="width:210px" value="#{Participante.cargo}" required="true" requiredMessage="#{msg['requerido.cargo']}"> <f:selectItem itemValue="Vocalista" itemLabel="Vocalista" /> <f:selectItem itemValue="Guitarrista" itemLabel="Guitarrista" /> <f:selectItem itemValue="Baixista" itemLabel="Baixista" /> <f:selectItem itemValue="Baterista" itemLabel="Baterista" /> <f:selectItem itemValue="Gerente" itemLabel="Gerente de Projetos" /> <f:selectItem itemValue="" itemLabel="" /> <f:validateRegex pattern="[a-zA-Z]+" /> </h:selectOneMenu> <h:message for="tcargo" style="color:red" /> <h:outputText id="ldata" value="Data de Admissão" /> <h:inputText value="#{Participante.data}" required="true" requiredMessage="#{msg['requerido.data']}"> <f:convertDateTime pattern="dd/mm/yyyy" /> </h:inputText> <h:message for="tdata" style="color:red" /> <h:outputText id="lsalario" value="Salário" /> <h:inputText id="tsalario" value="#{Participante.salario}" required="true" label="Salário" requiredMessage="#{msg['requerido.salario']}" validatorMessage="#{msg['validar.salario']}"> <f:convertNumber currencySymbol="$" type="currency" /> <f:validateDoubleRange minimum="788.00" maximum="9999.99" /> </h:inputText> <h:message for="tsalario" style="color:red" /> <h:outputText id="lgenero" value="Sexo" /> <h:selectOneRadio id="tgenero" value="#{Participante.genero}" required="true" requiredMessage="#{msg['requerido.genero']}"> <f:selectItem itemValue="Masculino" itemLabel="Masculino" /> <f:selectItem itemValue="Feminino" itemLabel="Feminino" /> </h:selectOneRadio> <h:message for="tgenero" style="color:red" /> <h:outputText id="lativo" value="Ativo" /> <h:selectBooleanCheckbox value="#{Participante.ativo}"></h:selectBooleanCheckbox> <br /> <h:outputText id="lobservacao" value="Observação" /> <h:inputTextarea value="#{Participante.observacao}" rows="5" cols="30" /> </h:panelGrid> </fieldset> <br /> <h:commandButton id="submit" action="#{Participante.enviarDados}" value="Enviar Dados" /> </h:form> </h:body> </html>
resultado.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <f:loadBundle basename="resources.application" var="msg" /> <head> <title><h:outputText value="#{msg.welcomeTitle}" /></title> </head> <h:body> <h2>JSF - Desenvolvimento Aberto - Managed Beans -</h2> <h3> <h:outputText id="lnome" value="Java Server Faces- Elementos de Formulário - Hibernate - Oracle" /> </h3> <h:panelGrid columns="2"> <h:outputLabel value="Nome:" /> <h:outputText value="#{Participante.nome}" /> <h:outputLabel value="Sobrenome:" /> <h:outputText value="#{Participante.sobrenome}" /> <h:outputLabel value="Cargo:" /> <h:outputText value="#{Participante.cargo}" /> <h:outputLabel value="Data de Admissão:" /> <h:outputText value="#{Participante.data}"> <f:convertDateTime pattern="dd/mm/yyyy" /> </h:outputText> <h:outputLabel value="Salário" /> <h:outputText value="#{Participante.salario}"> <f:convertNumber currencySymbol="$" type="currency" /> </h:outputText> <h:outputLabel value="Sexo:" /> <h:outputText value="#{Participante.genero}" /> <h:outputLabel value="Ativo:" /> <h:outputText value="#{Participante.ativo}" /> <h:outputLabel value="Observacao" /> <h:outputText value="#{Participante.observacao}" /> </h:panelGrid> </h:body> </html>