JSF – Persistência – Hibernate – Oracle – Java

Publicado: 11 de fevereiro de 2015 em Java

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

JSF – User Library

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

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

JSF – New Library

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

Hibernate - Lib - Required

Hibernate – Lib – Required

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

Hibernate - Library

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

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

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

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

JSF – Aplicação

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

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

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s