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:

JSF – User Library
2 – Clique no botão User Library para adicionar uma nova biblioteca:

JSF – Add Biblioteca
3 – Clique em New e crie um nome para sua biblioteca, geralmente Hibernate adicionado de sua versão:

JSF – New Library
4 – Clique em sua biblioteca e adicione os Jars externos localizados na pasta lib/required do Hibernate:

Hibernate – Lib – Required
5 – Com a biblioteca criada, confirme todas as janelas:

Hibernate – Library
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:

Oracle – JDBC – 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:

JSF – Deployment Assembly
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:

JSF – Project Explorer
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:

JSF – Aplicação
10 – Assim que os dados são inseridos uma página exibira o resultado:

JSF – 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>