Arquivo de fevereiro, 2015

Na maioria das vezes é útil utilizar componentes de listas conhecidos como Combobox ou Dropdown para mostrar relacionamentos de dados entre tabelas e de uma forma amigável exibir a descrição dos itens de dados e manipular seu identificador único. Para isto o Rails nos disponibiliza componentes e classes no qual nos permite manipular dados através de objetos e persisti-los em um banco de dados relacional usando o Active Record. Um relacionamento de dados mais simples é criado através de duas tabelas, sendo uma tabela pai que contem os dados mestres e uma filho que contem um ou mais identificadores relacionados ao pai. Um modo de fácil de identificar e tradicional de utilizar relacionamentos em um banco de dados é através de chaves estrangeiras, uma chave estrangeira é um campo, que aponta para a chave primária de outra tabela ou da mesma tabela. Ou seja, passa a existir uma relação entre duas tabelas ou de uma única tabela. A finalidade da chave estrangeira é garantir a integridade dos dados referenciais, pois apenas serão permitidos valores que supostamente vão aparecer na base de dados e estão ligados ao registro mestre.

Com associações do Active Record, podemos agilizar os processos de operações declarativas dizendo ao Rails que há uma conexão entre os dois modelos. Você pode usar belongs_to e has_many para criar um ligação simples entre dois modelos, a associação has_many indica uma ligação de um-para-muitos com outro modelo. Muitas vezes você vai encontrar essa associação no “outro lado” de uma associação belongs_to.

Associations: http://guides.rubyonrails.org/association_basics.html

No conceito de aplicações Rails você não precisa de restrições de chave estrangeira para que o Active Record possa mapear corretamente os relacionamentos. Você pode usar as validações para garantir a integridade dos dados. O Rails Migration não fornece provedor ajudante para criar chaves estrangeiras. Você pode criar seu próprio SQL para a restrição na migração ou usar o do Foreigner Gem. O Foreigner irá fornecer métodos auxiliares para a criação de restrições em uma migração.

Foreigner Gem: https://github.com/matthuhiggins/foreigner

Exibindo Relacionamentos

1 – Após criar um novo projeto Rails, o configure adequadamente para acessar o banco de dados MySQL, crie os modelos disponibilizados com código abaixo:

# Modelo Participante
rails g model participante nome:string sobrenome:string cargo_id:integer data:datetime salario:float genero:string ativo:boolean observacao:string

# Modelo Cargo
rails g model cargo desc_cargo:string
Console - Rails - Modelos

Console – Rails – Modelos

2 – Migre os modelos para criar as tabelas físicas no banco de dados:

Rails Migration

Rails Migration

3 – Abra o Rails Command  e utilize o modelo Cargo para criar novos registros no banco de dados:

# Grava objetos no banco de dados

Cargo.create(desc_cargo: "Vocalista")
Cargo.create(desc_cargo: "Guitarrista")
Cargo.create(desc_cargo: "Baixista")
Cargo.create(desc_cargo: "Baterista")
Rails - Command

Rails – Command

4 – O ajudante de referências não cria restrições de chave estrangeira para você. Você precisar cria-las e executa-las manualmente utilizando scripts SQL ou um plug-in que adiciona suporte a chave estrangeira. Você pode utilizar o código abaixo para criar uma restrição no banco de dados:

-- Cria Chave Estangeira
ALTER TABLE participantes
 ADD FOREIGN KEY (cargo_id)
 REFERENCES cargos(id)
MySQL - Chave Estrangeira

MySQL – Chave Estrangeira

5 – Utilize os códigos abaixo e rode sua aplicação:

Ruby on Rail - Aplicação

Ruby on Rail – Aplicação

6 – Assim que os dados forem enviados o Active Record gravará o conteúdo dos objetos no banco de dados relacional, você pode verificar na pagina que mostramos a descrição do campo cargo toda vez que utilizamos os dados da tabela de Cargos, porem na tabela Participante apenas seu identificador é gravado formando o relacionamento entre as duas tabelas:

MySQL - Workbench

MySQL – Workbench

Exemplo:

Neste exemplo criamos duas tabelas no banco de dados MySQL e as relacionamos através da chave primaria e uma chave estrangeira. Usamos um elemento Rails para tornar este relacionamento amigável, exibindo assim a descrição do relacionamento mas manipulando seu identificador e os persistindo através do Active Record.

Ruby

Model
Participante

class Participante < ActiveRecord::Base

  #Cria relacionamento
  belongs_to :cargo

  # Cria validação
  validates  :nome, :sobrenome, :data, :salario, :genero,
             :presence => true#{:message => "Campo obrigatório"}    

  # Regex - valores alphanumericos
  validates  :nome, :sobrenome,
             :format => {:with => /[A-Za-z]+/,
                         :message => "Permitido somente caracteres letras."}
end

Cargo

class Cargo < ActiveRecord::Base

  # Relacionamento
  has_many :participante

end

View

<h1>Desenvolvimento Aberto</h1>
<h2>Ruby on Rails - Elementos - Form </h2>

<%= form_for @modelo, :url => {:action => :create} do  |cad|%>

<% if @modelo.errors.any?  %>
<h3>Erros: </h3>
<ul style="color:red">
	<% @modelo.errors.full_messages.each do |menssagem| %>
	<li>
		<%= menssagem %>
	</li>
	<% end %>
</ul>
<% end %>
<fieldset>
	<legend>
		Cadastro:
	</legend>
	<table>
		<tr>
			<td> <%= cad.label :nome%> </td>
			<td> <%= cad.text_field :nome  %> </td>
		</tr>
		<tr>
			<td><%= cad.label :sobrenome%></td>

			<td><%= cad.text_field :sobrenome, :size => "35x10"%></td>
		</tr>

		<tr>
			<td><%= cad.label :cargo%></td>
			<td><%= collection_select(:participante, :cargo_id, Cargo.all, :id, :desc_cargo)%> </td>
		</tr>

		<tr>
			<td><%= cad.label :data%></td>

			<td><%= cad.date_field :data, :size => "15x10"%></td>
		</tr>

		<tr>
			<td><%= cad.label :salario%></td>
			<td><%= cad.text_field :salario, :size => "10x10"%></td>
		</tr>

		<tr>
			<td><%= cad.label :genero%></td>
			<td><%= cad.collection_radio_buttons :genero, [["Masculino", "Masculino"] ,["Feminino", "Feminino"]] ,
        :first, :last, { item_wrapper_tag: false } %></td>
		</tr>
		<tr>
			<td><%= cad.label :ativo%></td>
			<td><%= cad.check_box :ativo %></td>
		</tr>

		<tr>
			<td><%= cad.label :observacao%></td>
			<td><%= cad.text_area :observacao , :size => "40x10" %></td>
		</tr>

	</table>
</fieldset>
<p>
	<%= cad.submit "Adicionar dados" %>
</p>

<% end %>

Controller

class MeucontroleController < ApplicationController
  # Controladores
  def index
    @modelo  = Participante.new
  end

  def new
    @modelo  = Participante.new
  end

  # Cria registro
  def create
    @modelo = Participante.new(modelo_params)
    if @modelo.save

      flash[:notice] = "Dados Salvos com sucesso."
      render "index"
    else
    # Você pode colocar uma menssagem aqui.
      render "index"
    end
  end

  # Define parametros requeridos
  private

  def modelo_params
    params.require(:participante).permit(:nome, :sobrenome, :cargo_id, :data,
    :salario, :genero, :ativo, :observacao)
  end

end

DJango – ModelChoiceField – MySQL – Python

Publicado: 24 de fevereiro de 2015 em Python

Na maioria das vezes é útil utilizar componentes de listas conhecidos como Combobox ou Dropdown para mostrar relacionamentos de dados entre tabelas e de uma forma amigável exibir a descrição dos itens de dados e manipular seu identificador único. Para isto o DJango nos disponibiliza componentes e classes no qual nos permite manipular dados através de objetos e persisti-los em um banco de dados relacional usando o DJango ORM. Um relacionamento de dados mais simples é criado através de duas tabelas, sendo uma tabela pai que contem os dados mestres e uma filho que contem um ou mais identificadores relacionados ao pai. Um modo de fácil de identificar e tradicional de utilizar relacionamentos em um banco de dados é através de chaves estrangeiras, uma chave estrangeira é um campo, que aponta para a chave primária de outra tabela ou da mesma tabela. Ou seja, passa a existir uma relação entre duas tabelas ou de uma única tabela. A finalidade da chave estrangeira é garantir a integridade dos dados referenciais, pois apenas serão permitidos valores que supostamente vão aparecer na base de dados e estão ligados ao registro mestre.

O DJango possui o elemento ModelChoiceField que nos possibilita retornar dados diretamente do modelo, permitindo a seleção de um único objeto do modelo, adequado para a representação de uma chave estrangeira, possibilita ainda um numero de possíveis diferentes configurações.

ModelChoiceField: https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

Exibindo Relacionamentos

1 – Após criar um novo projeto e uma aplicação Django e o configure adequadamente para acessar o banco de dados MySQL, utilize o modelo disponibilizado no código abaixo e sincronize o banco de dados:

Django - SyncDB

Django – SyncDB

2 – O Modelo criou duas tabelas e seus respectivos objetos no banco de dados MySQL , atente-se para a chave estrangeira que cria o relacionamento entre as tabelas usando a chave primaria da tabela pai:

MySQL - Relacionamento - Chave Estrangeira

MySQL – Relacionamento – Chave Estrangeira

3 – Utilize os códigos abaixo e rode sua aplicação:

DJango - Aplicação

DJango – Aplicação

4 – Assim que os dados forem enviados o DJango ORM gravará o conteúdo dos objetos no banco de dados relacional, você pode verificar na pagina que mostramos a descrição do campo cargo toda vez que utilizamos os dados da tabela de Cargos, porem na tabela Funcionário apenas seu identificador é gravado formando o relacionamento entre as duas tabelas:

MySQL - WorkBench

MySQL – WorkBench

Exemplo:

Neste exemplo criamos duas tabelas no banco de dados MySQL e as relacionamos através da chave primaria e uma chave estrangeira. Usamos um elemento DJango para tornar este relacionamento amigável, exibindo assim a descrição do relacionamento mas manipulando seu identificador e os persistindo através do DJango ORM.

Python

Model

from django.db import models

# Cria modelo Funcionario
class Funcionario (models.Model):
    nome = models.CharField(max_length=30)
    sobrenome = models.CharField(max_length=50)
    id_cargo = models.ForeignKey('Cargo')
    data = models.DateField()
    salario = models.DecimalField(max_digits=19, decimal_places=10)
    genero = models.CharField(max_length=30)
    ativo = models.BooleanField()
    observacao = models.CharField(max_length=255)

    # Define unicode para o Django Admin
    def __unicode__(self):
        return u'{0}'.format(self.nome)

# Cria modelo Cargo
class Cargo (models.Model):
    nome = models.CharField(max_length=50)

    def __unicode__(self):
        return u'{0}'.format(self.nome)

View

from django.shortcuts import render, render_to_response, RequestContext
from django.http import HttpResponse

# Importa form
from meusite.forms import MeuForm

# Exibe View
def home(request):

    # Cria form
    form = MeuForm(request.POST or None)   

    # Valida e salva
    if form.is_valid():
        salvar = form.save(commit=False)
        salvar.save()
        return HttpResponse("Dados inseridos com sucesso!")

    # Chama Template
    return render_to_response("devaberto.html",
                              locals(),
                              context_instance = RequestContext(request))

Forms

from  django import forms
from django.forms import extras
from django.core.validators import RegexValidator

# Importa modulo Regex
import re 

# cria objeto Regex
caracteres = RegexValidator(
    # regex= re.compile(r"[a-zA-Z]+"),
    regex=r"[a-zA-Z]+",
    message="Permitido somente caracteres Alpha numericos",
    code="invalid")

# Importa modelo
from models import Funcionario
from models import Cargo

# Cria classe do form para o modelo
class MeuForm(forms.ModelForm):

    # Cria Conteudo
    GENEROS = (("Masculino", "Masculino"), ("Feminino", "Feminino"))

    # Define Widgets
    nome = forms.CharField(required=True, validators=[caracteres])
    sobrenome = forms.CharField(required=True, validators=[caracteres])
    id_cargo = forms.ModelChoiceField (queryset=Cargo.objects.all().order_by('id'), widget=forms.Select)
    data = forms.DateField(required=True, widget=forms.extras.SelectDateWidget)
    salario = forms.DecimalField()
    genero = forms.ChoiceField (required=True, widget=forms.RadioSelect, choices=GENEROS)
    ativo = forms.BooleanField()
    observacao = forms.CharField(widget=forms.Textarea)    

    # Associa formulario ao modelo
    class Meta:
        model = Funcionario

    # Django Validations  - customizado campo sobrenome
    def clean_sobrenome(self):
        snome = self.cleaned_data['sobrenome']
        if len(snome) <= 3:
            raise forms.ValidationError("Sobrenome precisa conter mais de 3 caracteres.")
        return snome

Template

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<title>Desenvolvimento Aberto</title>
		<style>
			body {

				font-family: "Times New Roman", Times, serif;
				font-size: 12px;
			}
		</style>
	</head>
	<body>

		<h1>Desenvolvimento Aberto - Django - Elementos - Widgets </h1>

		<form method="post" action="">
			<fieldset>
				<legend>
					Cadastro:
				</legend>
				{% csrf_token %}
				<table>
					<td> {{ form.as_table }} </td>
				</table>
				<hr />
				<input type="submit" />
			</fieldset>
		</form>

	</body>
</html>

ASP NET – DropDownList – NHibernate – Oracle – C#

Publicado: 23 de fevereiro de 2015 em C#

Na maioria das vezes é útil utilizar componentes de listas conhecidos como Combobox ou Dropdown para mostrar relacionamentos de dados entre tabelas e de uma forma amigável exibir a descrição dos itens de dados e manipular seu identificador único. Para isto o ASP.NET nos disponibiliza componentes e classes no qual nos permite manipular dados através de objetos e persisti-los em um banco de dados relacional usando o NHibernate. Um relacionamento de dados mais simples é criado através de duas tabelas, sendo uma tabela pai que contem os dados mestres e uma filho que contem um ou mais identificadores relacionados ao pai. Um modo de fácil de identificar e tradicional de utilizar relacionamentos em um banco de dados é através de chaves estrangeiras, uma chave estrangeira é um campo, que aponta para a chave primária de outra tabela ou da mesma tabela. Ou seja, passa a existir uma relação entre duas tabelas ou de uma única tabela. A finalidade da chave estrangeira é garantir a integridade dos dados referenciais, pois apenas serão permitidos valores que supostamente vão aparecer na base de dados e estão ligados ao registro mestre.

O C# nos disponibiliza uma facilidade para manipular dados em seus controles e objetos, pois alguns de seus controles possuem a herança da classe BaseDataBoundControl e nos contempla com a propriedade DataSource, que obtém ou define o objeto do qual o controle vinculado aos dados recupera sua lista de itens de dados. Está propriedade é muito similar e remete automaticamente à lembrança dos objetos da linguagem de programação Object Pascal (Delphi).

BaseDataBoundControl Class:

https://msdn.microsoft.com/en-us/library/System.Web.UI.WebControls.BaseDataBoundControl(v=vs.110).aspx

 

Exibindo Relacionamentos

1 – Primeiro crie duas tabelas e seus respectivos objetos no banco de dados Oracle, atente-se para a chave estrangeira que cria o relacionamento entre as tabelas usando a chave primaria da tabela pai:

Oracle - Relacionamento

Oracle – Relacionamento

2 – Crie uma aplicação ASP.NET do tipo C# Empty, configure seu projeto com as referencias necessárias para o NHibernate e Oracle Database. Utilize os códigos abaixo e rode sua aplicação:

ASP.NET - Aplicação

ASP.NET – Aplicação

3 – Assim que os dados forem enviados o NHibernate gravará o conteúdo dos objetos no banco de dados relacional, você pode verificar na pagina que mostramos a descrição do campo cargo toda vez que utilizamos os dados da tabela de Cargos, porem na tabela Participante apenas seu identificador é gravado formando o relacionamento entre as duas tabelas:

Oracle - Relacionamento - Chave Estrangeira

Oracle – Relacionamento – Chave Estrangeira

Exemplo:

Neste exemplo criamos duas tabelas no banco de dados Oracle e as relacionamos através da chave primaria e uma chave estrangeira. Usamos um elemento ASP.NET para tornar este relacionamento amigável, exibindo assim a descrição do relacionamento mas manipulando seu identificador e os persistindo através do NHibernate.

SQL

-- Cria Sequence Participante
CREATE SEQUENCE SEQ_PARTICIPANTE
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;
 
-- Cria tabela de participantes
CREATE TABLE PARTICIPANTE
(
  ID_PART INTEGER NOT NULL
, NOME VARCHAR2(30) NOT NULL
, SOBRENOME VARCHAR2(70) NOT NULL
, ID_CARGO INTEGER 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
);
 
-- Cria Sequence Cargo
CREATE SEQUENCE SEQ_CARGO
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;
 
-- Cria tabela de cargo
Create Table CARGO (
 ID_CARGO INTEGER NOT NULL,
 DESC_CARGO VARCHAR2(50) NOT NULL,
 
CONSTRAINT CARGO_PK PRIMARY KEY
  (
     ID_CARGO
  )
  ENABLE
 
);
 
-- Alimenta dados na tabela de cargos
insert into cargo values (SEQ_CARGO.NEXTVAL , 'Vocalista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Guitarrista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Baixista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Baterista');
 
-- Cria Contraint chave estrangeira
ALTER TABLE PARTICIPANTE ADD CONSTRAINT CARGO_FK
FOREIGN KEY  (ID_CARGO) REFERENCES CARGO (ID_CARGO);

Web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

  <appSettings>
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
  </appSettings>

</configuration>

Hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
    <property name="connection.connection_string">
      User Id=user;
      Password=pass;
      Data Source=XE;
      Pooling=true;
      Enlist=false;
      Statement Cache Size=50;
      Min Pool Size=10;
      Incr Pool Size=5;
      Decr Pool Size=2;
    </property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

Participante

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001
{
    public class Participante
    {

        // Declara atributos publicos
        private long id;
        private string nome;
        private string sobrenome;
        private int cargo;
        private DateTime data;
        private double salario;
        private string genero;
        private Boolean ativo;
        private string observacao;

       // Declara propriedades
        public long Id
        {
            get { return id; }
            set { id = value; }
        }

        public string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        public string Sobrenome
        {
            get { return sobrenome; }
            set { sobrenome = value; }
        }

        public int Cargo
        {
            get { return cargo; }
            set { cargo = value; }
        }

        public DateTime Data
        {
            get { return data; }
            set { data = value; }
        }

        public double Salario
        {
            get { return salario; }
            set { salario = value; }
        }

        public string Genero
        {
            get { return genero; }
            set { genero = value; }
        }

        public Boolean Ativo
        {
            get { return ativo; }
            set { ativo = value; }
        }

        public string Observacao
        {
            get { return observacao; }
            set { observacao = value; }
        }
    }
}

ParticipanteRepository

using DAWebApp001.Models;
using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001
{
    public class ParticipanteRepository
    {
        public void Add(ParticipanteModelo participante)
        {
            // Cria sessão
            using (ISession session = DbConexaoFactory.OpenSession())
            {
                // Cria transação
                using (ITransaction transaction = session.BeginTransaction())
                {
                    // Salva e finaliza
                    session.Save(participante);
                    transaction.Commit();
                }
            }
        }

        public IList<CargoModelo> retornaCargos()
        {
            // Abre conexão
            using (ISession session = DbConexaoFactory.OpenSession())
            {
                
                // Cria transação
                using (ITransaction transaction = session.BeginTransaction())
                {

                    // Retorna dados e finaliza.
                    var itens =  session.CreateQuery("FROM CargoModelo").List<CargoModelo>();
                    transaction.Commit();

                    return itens;
                }
            }          
            
        }

    }
}

DBConcexaoFactory

using DAWebApp001.Models;
using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001
{
    public class DbConexaoFactory
    {
        private static ISessionFactory _sessionFactory;

        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var configuration = new Configuration();
                    configuration.Configure();
                    configuration.AddAssembly(typeof(ParticipanteModelo).Assembly);
                    _sessionFactory = configuration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }

    }
}

ParticipanteModelo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001.Models
{
    public class ParticipanteModelo
    {
        // Declara atributos publicos
        private int id_part;
        private string nome;
        private string sobrenome;
        private int cargo;
        private DateTime data_admissao;
        private double salario;
        private string genero;
        private string ativo;
        private string observacao;

        // Declara propriedades
        public virtual int Id_Part
        {
            get { return id_part; }
            set { id_part = value; }
        }

        public virtual string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        public virtual string Sobrenome
        {
            get { return sobrenome; }
            set { sobrenome = value; }
        }

        public virtual int Cargo
        {
            get { return cargo; }
            set { cargo = value; }
        }

        public virtual DateTime Data_Admissao
        {
            get { return data_admissao; }
            set { data_admissao = value; }
        }

        public virtual double Salario
        {
            get { return salario; }
            set { salario = value; }
        }

        public virtual string Genero
        {
            get { return genero; }
            set { genero = value; }
        }

        public virtual string Ativo
        {
            get { return ativo; }
            set { ativo = value; }
        }

        public virtual string Observacao
        {
            get { return observacao; }
            set { observacao = value; }
        }
    }
}

ParticipanteModelo.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="DAWebApp001"
                   namespace="DAWebApp001.Models">

  <class name="ParticipanteModelo" table="PARTICIPANTE">
    <id name="Id_Part" column="ID_PART">
      <generator class="native" >
        <param name="sequence">SEQ_PARTICIPANTE</param>
      </generator>
    </id>
    <property name="Nome"  column="NOME"/>
    <property name="Sobrenome" column="SOBRENOME"/>
    <property name="Cargo" column="ID_CARGO" />
    <property name="Data_Admissao" column="DATA_ADMISSAO" />
    <property name="Salario" column="SALARIO"/>
    <property name="Genero" column="GENERO" />
    <property name="Ativo" column="ATIVO"/>
    <property name="Observacao" column="OBSERVACAO" />
  </class>

</hibernate-mapping>

CargoModelo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001.Models
{
    public class CargoModelo
    {
        // Declara atributos
        private int id_cargo;
        private string desc_cargo;

        // Declara propriedades virtuais
        public virtual int Id_cargo
        {
            get { return id_cargo; }
            set { id_cargo = value; }
        }

        public virtual string  Desc_cargo
        {
            get { return desc_cargo; }
            set { desc_cargo = value; }
        }
        
    }
}

CargoModelo.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="DAWebApp001"
                   namespace="DAWebApp001.Models">

  <class name="CargoModelo" table="CARGO">
    <id name="Id_cargo" column="ID_CARGO">
      <generator class="native" >
        <param name="sequence">SEQ_CARGO</param>
      </generator>
    </id>
    <property name="Desc_cargo"  column="DESC_CARGO"/>    
  </class>

</hibernate-mapping>

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DAWebApp001._default" %>


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Desenvolvimento Aberto</title>
    <style type="text/css">
        .auto-style2 {
            width: 14%;
        }

        .auto-style3 {
            height: 23px;
        }

        .auto-style5 {
            width: 248px;
        }

        .auto-style6 {
            width: 54%;
        }

        .auto-style8 {
            height: 23px;
            width: 54%;
        }

        .auto-style9 {
            height: 23px;
            width: 248px;
        }
    </style>

</head>
<body>
    <h1>Desenvolvimento Aberto - ASP.NET</h1>
    <h2>Cadastro - DropDownList - NHibernate - Oracle Database -  ASP.NET</h2>
    <form id="form1" runat="server">
        <div>
            <fieldset style="padding: 20px">
                <legend style="padding: 5px">Cadastro</legend>
                <table style="width: 100%;">
                    <tr>
                        <td class="auto-style3" colspan="2">
                            <asp:Label ID="LabelMenssagem" runat="server" Text="Entre com os dados abaixo:"></asp:Label>
                        </td>
                        <td class="auto-style8"></td>
                    </tr>
                    <tr>
                        <td class="auto-style2">
                            <asp:Label ID="Label2" runat="server" Text="Nome:"></asp:Label>
                        </td>
                        <td class="auto-style5">
                            <asp:TextBox ID="TextBox1nome" onMouseOver="meuMouseOver()" onMouseOut="meuMouseOut()" runat="server" Width="142px"></asp:TextBox>
                        </td>
                        <td class="auto-style6">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1nome" ErrorMessage="Nome é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1nome" ErrorMessage="Permitido somente caractere  alphanumericos" ForeColor="Red" ValidationExpression="[a-zA-Z]+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label3" runat="server" Text="Sobrenome:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox2sobrenome" runat="server" Width="240px"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TextBox2sobrenome" ErrorMessage="Sobrenome é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ControlToValidate="TextBox2sobrenome" ErrorMessage="Permitido somente caractere  alphanumericos" ForeColor="Red" ValidationExpression="[a-zA-Z]+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label4" runat="server" Text="Cargo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:DropDownList ID="DropDownList1" runat="server" Height="16px" Width="211px">
                            </asp:DropDownList>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="DropDownList1" ErrorMessage="Cargo é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label6" runat="server" Text="Data de Admissão:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox1Data" runat="server" Width="177px"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="TextBox1Data" ErrorMessage="Data de admissão é obrigatória." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator5" runat="server" ControlToValidate="TextBox1Data" ErrorMessage="Formato de data invalido, use (dd/mm/yyyy)." ForeColor="Red" ValidationExpression="^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label5" runat="server" Text="Salário:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox4salario" runat="server"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="TextBox4salario" ErrorMessage="Salário é obrigatório. " ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" ControlToValidate="TextBox4salario" ErrorMessage="Permitido somente caractere  numericos e decimais." ForeColor="Red" ValidationExpression="(?:\d*\.)?\d+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label7" runat="server" Text="Sexo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:RadioButton ID="RadioButton1" runat="server" GroupName="Grupo1" Text="Masculino" />
                            <asp:RadioButton ID="RadioButton2" runat="server" GroupName="Grupo1" Text="Feminino" />
                        </td>
                        <td class="auto-style8">
                            <br />
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label8" runat="server" Text="Ativo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:CheckBox ID="CheckBox1" runat="server" Text="Cadastro Valido" />
                        </td>
                        <td class="auto-style8">
                            <br />
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label9" runat="server" Text="Observação:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox1Observacao" runat="server" Columns="40" Rows="5" TextMode="MultiLine"></asp:TextBox>
                        </td>
                        <td class="auto-style8">&nbsp;</td>
                    </tr>
                    <tr>
                        <td class="auto-style3" colspan="3">
                            <hr />
                            &nbsp;</td>
                    </tr>
                    <tr>
                        <td class="auto-style3">

                            <asp:Button ID="Button1enviardados" runat="server" Text="Enviar Dados" OnClick="Button1enviardados_Click" ValidationGroup="AllValidator" />
                        </td>
                        <td class="auto-style9">&nbsp;</td>
                        <td class="auto-style8">&nbsp;</td>
                    </tr>
                </table>
            </fieldset>
        </div>
    </form>
</body>
</html>

Default.aspx.cs

using DAWebApp001.Models;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace DAWebApp001
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Verifica se a pagina foi carregada pela primeira vez
            if (!Page.IsPostBack)
            {
                // Configura Hibernate
                LoadNHibernateCfg();
                
                // Cria repositorio par o objeto
                ParticipanteRepository repositorio = new ParticipanteRepository();

                // Retorna set de dados
                IList<CargoModelo> itens = repositorio.retornaCargos();

                // Adiciona set de dados ao Datasource
                DropDownList1.DataSource = itens;
                DropDownList1.DataTextField = "Desc_cargo";
                DropDownList1.DataValueField = "Id_cargo";

                // Liga componente
                DropDownList1.DataBind();

            }

            // Cria objeto na sessão
            Participante participante = new Participante();

            Session["Cadastro"] = participante;

        }

        protected void Button1enviardados_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                // Recupera objeto da Session
                Participante cad = (Participante)Session["Cadastro"];

                // Valor normalmente é um autoincremento
                // Ou pelo banco Identity (MSSQL) Sequence (Oracle, DB2, etc)
                // Ou algum framework ORM - NUNCA faça um autoincremento manualmente na aplicação
                cad.Id = 1;

                // Alimenta Objeto
                cad.Nome = TextBox1nome.Text;
                cad.Sobrenome = TextBox2sobrenome.Text;
                cad.Cargo = Convert.ToInt32( DropDownList1.SelectedValue);
                cad.Data = DateTime.Parse(TextBox1Data.Text);
                cad.Salario = Double.Parse(TextBox4salario.Text);

                // Verifica valores boleanos
                if (RadioButton1.Checked)
                {
                    cad.Genero = RadioButton1.Text;
                }

                if (RadioButton2.Checked)
                {
                    cad.Genero = RadioButton2.Text;
                }

                cad.Ativo = CheckBox1.Checked;
                cad.Observacao = TextBox1Observacao.Text;
                                
                // Carrega configuração do NHibernate
                LoadNHibernateCfg();

                // Objeto de transferencia
                transfereParticipante(cad);

                // Redireciona pagina
                Response.Redirect("resultado.aspx");

            }

        }

        private static void transfereParticipante(Participante participante)
        {
            // Define repositorio
            ParticipanteRepository repositorio = new ParticipanteRepository();

            // Define Modelo
            ParticipanteModelo modelo = new ParticipanteModelo();

            // Transfere objeto para o Modelo (Domain)
            // objeto de transferncia é util quando vc tem 
            // que converter o tipo de dados antes de gravar
            
            modelo.Nome = participante.Nome;
            modelo.Sobrenome = participante.Sobrenome;
            modelo.Cargo = participante.Cargo;
            modelo.Data_Admissao = participante.Data;
            modelo.Salario = participante.Salario;
            modelo.Genero = participante.Genero;
            modelo.Ativo = participante.Ativo.ToString();
            modelo.Observacao = participante.Observacao;

            // Grava dados
            repositorio.Add(modelo);

        }

        private static void LoadNHibernateCfg()
        {
            // Carrega configuração NHibernate
            var cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(typeof(ParticipanteModelo).Assembly);
            
        }
    }
}

Resultado.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="resultado.aspx.cs" Inherits="DAWebApp001.resultado" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .auto-style1 {
            width: 143px;
        }

        .auto-style2 {
            width: 143px;
            height: 23px;
        }

        .auto-style3 {
            height: 23px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h1>Desenvolvimento Aberto - ASP.NET</h1>
            <h2>Cadastro - Controles - ASP.NET - NHibernate - Oracle Database</h2>
            <h3>Dados Gravados com sucesso:</h3>

            <table style="width: 100%;">
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label1" runat="server" Text="Nome:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lnome" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label2" runat="server" Text="Sobrenome:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lsobrenome" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style2">
                        <asp:Label ID="Label3" runat="server" Text="Cargo:"></asp:Label>
                    </td>
                    <td class="auto-style3">
                        <asp:Label ID="Lcargo" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td class="auto-style3"></td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label4" runat="server" Text="Data de Admissão:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="ldata" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label5" runat="server" Text="Salário:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lsalario" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label6" runat="server" Text="Sexo:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lgenero" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style2">
                        <asp:Label ID="Label7" runat="server" Text="Ativo:"></asp:Label>
                    </td>
                    <td class="auto-style3">
                        <asp:Label ID="lativo" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td class="auto-style3"></td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label8" runat="server" Text="Observação:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lobservacao" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
            </table>
            <br />

        </div>
    </form>
</body>
</html>

Resultado.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DAWebApp001
{
    public partial class resultado : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            // Recupera objeto
            Participante cad = (Participante)Session["Cadastro"];

            if (Session["Cadastro"] != null)
            {
                // Alimemta valores
                lnome.Text = cad.Nome;
                lsobrenome.Text = cad.Sobrenome;
                Lcargo.Text = cad.Cargo.ToString();
                ldata.Text = cad.Data.ToString();
                lsalario.Text = cad.Salario.ToString();
                lgenero.Text = cad.Genero;
                lativo.Text = cad.Ativo.ToString();
                lobservacao.Text = cad.Observacao;
            }

        }
    }
}

Na maioria das vezes é útil utilizar componentes de listas conhecidos como Combobox ou Dropdown para mostrar relacionamentos de dados entre tabelas e de uma forma amigável exibir a descrição dos itens de dados e manipular seu identificador único. Para isto o JavaServer Faces nos disponibiliza componentes e classes no qual nos permite manipular dados através de objetos e persisti-los em um banco de dados relacional usando o Hibernate. Um relacionamento de dados mais simples é criado através de duas tabelas, sendo uma tabela pai que contem os dados mestres e uma filho que contem um ou mais identificadores relacionados ao pai. Um modo de fácil de identificar e tradicional de utilizar relacionamentos em um banco de dados é através de chaves estrangeiras, uma chave estrangeira é um campo, que aponta para a chave primária de outra tabela ou da mesma tabela. Ou seja, passa a existir uma relação entre duas tabelas ou de uma única tabela. A finalidade da chave estrangeira é garantir a integridade dos dados referenciais, pois apenas serão permitidos valores que supostamente vão aparecer na base de dados e estão ligados ao registro mestre.

Exibindo Relacionamentos

1 – Primeiro crie duas tabelas e seus respectivos objetos no banco de dados Oracle, atente-se para a chave estrangeira que cria o relacionamento entre as tabelas usando a chave primaria da tabela pai:

Oracle - Relacionamento

Oracle – Relacionamento

2 – Crie uma aplicação JSF e use o código abaixo, o código é o mesmo dos exemplos anteriores, porem criamos novos objetos e novos modelos para comportar o relacionamento de dados das duas tabelas e exibi-los de uma forma amigável na pagina web. Clicando no botão de enviar, você automaticamente grava os dados no banco de dados:

JSF - Hibernate - Oracle

JSF – Hibernate – Oracle

3 – Assim que os dados forem enviados o Hibernate gravará o conteúdo dos objetos no banco de dados relacional, você pode verificar na pagina que mostramos a descrição do campo cargo toda vez que utilizamos os dados da tabela de Cargos, porem na tabela Participante apenas seu identificador é gravado formando o relacionamento entre as duas tabelas:

Oracle - Relacionamento - Chave Estrangeira

Oracle – Relacionamento – Chave Estrangeira

Exemplo:

Neste exemplo criamos duas tabelas no banco de dados Oracle e as relacionamos através da chave primaria e uma chave estrangeira. Usamos um elemento JSF para tornar este relacionamento amigável, exibindo assim a descrição do relacionamento mas manipulando seu identificador e os persistindo através do Hibernate.

SQL

-- Cria Sequence Participante
CREATE SEQUENCE SEQ_PARTICIPANTE
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela de participantes
CREATE TABLE PARTICIPANTE
(
  ID_PART INTEGER NOT NULL
, NOME VARCHAR2(30) NOT NULL
, SOBRENOME VARCHAR2(70) NOT NULL
, ID_CARGO INTEGER 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
);

-- Cria Sequence Cargo
CREATE SEQUENCE SEQ_CARGO
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela de cargo
Create Table CARGO (
 ID_CARGO INTEGER NOT NULL,
 DESC_CARGO VARCHAR2(50) NOT NULL,

CONSTRAINT CARGO_PK PRIMARY KEY
  (
     ID_CARGO
  )
  ENABLE

);

-- Alimenta dados na tabela de cargos
insert into cargo values (SEQ_CARGO.NEXTVAL , 'Vocalista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Guitarrista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Baixista');
insert into cargo values (SEQ_CARGO.NEXTVAL, 'Baterista');

-- Cria Contraint chave estrangeira
ALTER TABLE PARTICIPANTE ADD CONSTRAINT CARGO_FK
FOREIGN KEY  (ID_CARGO) REFERENCES CARGO (ID_CARGO);

Java

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.Oracle10gDialect</property>
<property name="hibernate.current_session_context_class">thread</property>

<mapping class="org.desenvolvimento.aberto.Modelo.CargoModelo" />
<mapping class="org.desenvolvimento.aberto.Modelo.ParticipanteModelo" />

</session-factory>
</hibernate-configuration>

Participante

package org.desenvolvimento.aberto;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.desenvolvimento.aberto.Modelo.CargoModelo;
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 int cargo;
	private Date data;
	private double salario;
	private String genero;
	private boolean ativo;
	private String observacao;
	private List<SelectItem> cargoItem;

	// 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 int getCargo() {
		return cargo;
	}

	public void setCargo(int 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;
	}

	public List<SelectItem> getCargoItem() {

		// Cria objeto de modelo Faces
		cargoItem = new ArrayList<SelectItem>();

		// cria objeto DAO
		ParticipanteDao participante = new ParticipanteDao();
		List<CargoModelo> cargo = participante.listacargos();

		// Alimenta Modelo
		for (CargoModelo c : cargo) {
			SelectItem selecao = new SelectItem(c.getId_cargo(), c.getCargo());
			cargoItem.add(selecao);

		}

		return cargoItem;
	}

	// 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;
		}

	}

}

IParticipanteDao

package org.desenvolvimento.aberto.dao;

import java.util.List;

import org.desenvolvimento.aberto.Modelo.CargoModelo;
import org.desenvolvimento.aberto.Modelo.ParticipanteModelo;

public interface IParticipanteDao {

	// Define método abstrato

	boolean insereDados(ParticipanteModelo participante);
	public List<CargoModelo> listacargos();
}

ParticipanteDao

package org.desenvolvimento.aberto.dao;

import java.util.List;

import org.hibernate.Session;
import org.desenvolvimento.aberto.Factory.*;
import org.desenvolvimento.aberto.Modelo.ParticipanteModelo;
import org.desenvolvimento.aberto.Modelo.CargoModelo;

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;
		}

	}

	@Override
	public List<CargoModelo> listacargos() {
		List<CargoModelo> itens = null;

		// Cria sessão
		Session session = DBConexaoFactory.getSessionFactory().openSession();

		// Cria transação
		session.beginTransaction();

		// Recupera dados
		String sql = "FROM CargoModelo";

		itens = session.createQuery(sql).list();

		// Confirma e encerra transação
		session.getTransaction().commit();

		return itens;

	}

}

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();
	}

}

CargoModelo

package org.desenvolvimento.aberto.Modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "CARGO")
public class CargoModelo {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_CARGO")
	@SequenceGenerator(name = "SEQ_CARGO", sequenceName = "SEQ_CARGO")
	@Column(name = "ID_CARGO")
	private int id_cargo;

	@Column(name = "DESC_CARGO")
	private String cargo;

	// Métodos Getter & Setter
	public int getId_cargo() {
		return id_cargo;
	}

	public void setId_cargo(int id_cargo) {
		this.id_cargo = id_cargo;
	}

	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

}

ParticipanteModelo

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 = "ID_CARGO")
	private int 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 int getCargo() {
		return cargo;
	}

	public void setCargo(int 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;
	}

}

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 itemLabel=" - Selecione uma opção - " itemValue=""/>
					<f:selectItems value="#{Participante.cargoItem}" />
				</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="7"
					cols="40" />

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

 

Em princípio, os programas ABAP trabalham com dados de programas locais, que residem na sessão interna dos programas, os dados vivem somente enquanto seu contexto existe, estes tipos de dados são chamados de Transient e existem dentro de objetos de dados do ABAP. Os dados que podem ser preservados além do tempo de execução do programa é conhecido como persistente.

Em uma aplicação orientada a objeto ideal, os dados ocorrem apenas como os atributos de objetos, objetos são uma agregação de funções, nos métodos e de dados nos atributos. A descrição de um objeto, ou seja, a classe, ocorre persistentemente como um pedaço de código-fonte. Isto significa que linguagens orientadas a objeto persistem dados contidos nos atributos dos objetos, que podem ser manipulados através de seus métodos. Tecnicamente falando em uma linguagem orientada a objetos, os objetos contem dados Transients e através de serviços como o SAP Persistence Service podemos utilizar o recurso de mapeamento para preenche a lacuna entre a visão do banco de dados relacional e da visão orientada a objeto, ou seja podemos mapear um atributo que contem dados e liga-lo a um campo em uma tabela transparente.

Podemos identificar cada instancia do objeto utilizando um identificador único global ou GUID (Globally Unique IDentifier) que é um tipo especial de identificador utilizado em aplicações de software para providenciar um número de referência que será único em qualquer contexto (por isso é “Universal”) como, por exemplo, em uma definição de referência interna para um tipo de ponto de acesso em uma aplicação de software ou para a criação de chaves únicas em um banco de dados.

O serviço de persistência permite que o programador ABAP trabalhe com dados de bancos de dados relacionais de forma orientada a objetos, este serviço pode ser comparado a vários outros tipos  de frameworks conhecidos como ORM (Object-relational mapping) é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.

SAP Persistence Service: Serviço de Persistência

Usando o Serviço de Persistência com Web Dynpro

1 – Crie uma tabela transparente chamada ZPARTICIPANTE, utilize a imagem abaixo para os tipos de campos:

Tabela Transparente - ZParticipante

Tabela Transparente – ZParticipante

2 – No Class Builder, na transação SE24 crie uma nova classe do tipo persistente chamada ZCL_PARTICIPANTE:

Classe - ZCL_PARTICIPANTE

Classe – ZCL_PARTICIPANTE

3 – Note que temos uma classe com algumas interfaces implementadas. No menu Goto escolha Persistence Representant:

Class Builder

Class Builder

4 – Escolha a tabela transparente criada acima para o mapeamento do objeto:

Tabela Transparente - Mapeamento

Tabela Transparente – Mapeamento

5 – Selecione os campos do dicionário de dados na parte inferior e os insira na parte superior, no qual definirá o mapeamento relacional para o objeto:

Mapeamento - Relacional

Mapeamento – Relacional

6 – Com o mapeamento finalizado salve e volte para a edição da classe:

ORM - Mapeamento Objeto Relacional

ORM – Mapeamento Objeto Relacional

7 – Como você pode notar os atributos e métodos necessários para o mapeamento objeto relacional foram criados automaticamente, salve e ative a classe:

Classe Persistente - Implementada e Ativada

Classe Persistente – Implementada e Ativada

8 – Crie um novo componente Web Dynpro e utilize os elementos de acordo a cada campo na tela, crie um método para o botão e um método de persistência de acordo com os códigos abaixo:

Web Dynpro - MVC - View - ABAP

Web Dynpro – MVC – View – ABAP

9 – Salve, ative, crie e teste sua aplicação. Preencha os dados na pagina web e os envie, eles serão automaticamente persistidos no banco de dados utilizado pelo sistema:

Web Dynpro - Aplicação

Web Dynpro – Aplicação

10 – Você pode conferir os dados persistidos no bando através do Data Browser na transação SE16:

Persistência - Data Browser

Persistência – Data Browser

Exemplo:

Neste exemplo persistimos dados através do serviço de persistência SAP que utiliza um mapeamento objeto relacional, que pode ser considerado equivalente aos frameworks ORM de outras linguagens de programação como o Rails (Ruby),  Hibernate (Java), EF (C#) e ORM Django (Python) entre vários outros.

ABAP

Evento – ONACTIONACAO_BOTAO_ENVIAR

method ONACTIONACAO_BOTAO_ENVIAR .

* // Retorna campos do contexto da View
  DATA lo_nd_usuario_controler TYPE REF TO if_wd_context_node.

  DATA lo_el_usuario_controler TYPE REF TO if_wd_context_element.
  DATA ls_usuario_controler TYPE wd_this->Element_usuario_controler.
  DATA lv_cargo TYPE wd_this->Element_usuario_controler-cargo.

* // Recupera node controller
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).

* // Recupera elemento via lead selection
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

* // Recupera atributo
  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `CARGO`
    IMPORTING
      value = lv_cargo ).

* // Define objetos Regex
  DATA:  regex   TYPE REF TO cl_abap_regex,
         matcher TYPE REF TO cl_abap_matcher.

* Cria objeto Regex e define Pattern
  CREATE OBJECT regex
    EXPORTING
      pattern     = '[a-zA-Z]+'.

* // Verifica valot do elemento contra o Pattern
  matcher = regex->create_matcher( text =  lv_cargo ).

* // Verifca Pattern
IF matcher->match( ) NE 'X'.

* // Define menssagem
    data lo_api_controller     type ref to if_wd_controller.
    data lo_message_manager    type ref to if_wd_message_manager.

    lo_api_controller ?= wd_This->Wd_Get_Api( ).

* // Chama método de menssagem
    CALL METHOD lo_api_controller->GET_MESSAGE_MANAGER
      RECEIVING
        MESSAGE_MANAGER = lo_message_manager.

* // Exibe mensagem
    CALL METHOD lo_message_manager->REPORT_MESSAGE
      EXPORTING
        MESSAGE_TEXT      = 'Cargo é exclusivamente um campo alphanumérico'
        CANCEL_NAVIGATION = ABAP_TRUE.
  ENDIF.

* // Gravar dados
wd_this->ONGRAVAR( ).

endmethod.

Método – ONGRAVAR

method ONGRAVAR .

* // Recupera dados do controlador
  DATA lo_nd_usuario_controler TYPE REF TO if_wd_context_node.

  DATA lo_el_usuario_controler TYPE REF TO if_wd_context_element.
  DATA ls_usuario_controler TYPE wd_this->Element_usuario_controler.
  DATA lv_usuario_login TYPE wd_this->Element_usuario_controler-usuario_login.

  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

*   // Recupera Nome
  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `USUARIO_LOGIN`
    IMPORTING
      value = lv_usuario_login ).

* // Recupera Sobrenome
  DATA lv_sobrenome TYPE wd_this->Element_usuario_controler-sobrenome.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `SOBRENOME`
    IMPORTING
      value = lv_sobrenome ).

* // Recupera Cargo

  DATA lv_cargo TYPE wd_this->Element_usuario_controler-cargo.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `CARGO`
    IMPORTING
      value = lv_cargo ).

* // Recupera Salario
  DATA lv_salario TYPE wd_this->Element_usuario_controler-salario.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `SALARIO`
    IMPORTING
      value = lv_salario ).

* // Recupera Data
  DATA lv_data TYPE wd_this->Element_usuario_controler-data.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `DATA`
    IMPORTING
      value = lv_data ).

* // Recupera Genero
  DATA lv_genero TYPE wd_this->Element_usuario_controler-genero.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `GENERO`
    IMPORTING
      value = lv_genero ).

* // Recupera Ativo
  DATA lv_ativo TYPE wd_this->Element_usuario_controler-ativo.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `ATIVO`
    IMPORTING
      value = lv_ativo ).

* // Recupera Observacao

  DATA lv_observacao TYPE wd_this->Element_usuario_controler-observacao.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `OBSERVACAO`
    IMPORTING
      value = lv_observacao ).

* // Declara variáveis
  DATA : guid         TYPE zGuid,
         nome         TYPE ZNome,
         sobrenome    TYPE ZSobrenome,
         cargo        TYPE ZCargo,
         salario      TYPE Zsal,
         data_adm     TYPE Zdata,
         genero       TYPE ZGenero,
         ativo        TYPE Zativo,
         observacao   TYPE ZObservacao.

* // Alimenta dados.

  nome       = LV_USUARIO_LOGIN.
  sobrenome  = LV_SOBRENOME.
  cargo      = LV_CARGO.
  salario    = LV_SALARIO.
  data_adm   = LV_DATA.
  genero     = LV_GENERO.
  ativo      = LV_ATIVO.
  observacao = LV_OBSERVACAO.

* // Gera GUID

  CALL FUNCTION 'GUID_CREATE'
    IMPORTING
      ev_guid_16 = guid.

* // Cria persistencia
* // Declara classe Actor e Persistencia
  DATA:  agente       TYPE REF TO ZCA_PARTICIPANTE,
         participante TYPE REF TO ZCL_PARTICIPANTE.

* // Cria agente da classe actor
  AGENTE = ZCA_PARTICIPANTE=>AGENT.

* // cria persistencia
  try.
      participante = AGENTE->CREATE_PERSISTENT( guid ).
    catch CX_OS_OBJECT_EXISTING.
  ENDTRY.

* // Alimenta objeto de persistencia
  PARTICIPANTE->SET_NOME( NOME ).
  PARTICIPANTE->SET_SOBRENOME( SOBRENOME ).
  PARTICIPANTE->SET_CARGO( CARGO ).
  PARTICIPANTE->SET_DATA( DATA_ADM ).
  PARTICIPANTE->SET_SALARIO( SALARIO ).
  PARTICIPANTE->SET_GENERO( GENERO ).
  PARTICIPANTE->SET_ATIVO( ATIVO ).
  PARTICIPANTE->SET_OBSERVACAO( OBSERVACAO ).

* // Grava e finaliza persistencia
  TRY.
    COMMIT WORK.

* // Exibe mensagem
    data lo_api_controller     type ref to if_wd_controller.
    data lo_message_manager    type ref to if_wd_message_manager.

    lo_api_controller ?= wd_This->Wd_Get_Api( ).

* // Chama método de menssagem
    CALL METHOD lo_api_controller->GET_MESSAGE_MANAGER
      RECEIVING
        MESSAGE_MANAGER = lo_message_manager.

* // Exibe mensagem
    CALL METHOD lo_message_manager->REPORT_SUCCESS
      EXPORTING
        MESSAGE_TEXT = 'Dados Inseridos com Sucesso'.

  ENDTRY.

endmethod.

 

Web Dynpro – Persistência – SAP – Abap

Publicado: 15 de fevereiro de 2015 em Abap

O Open SQL consiste em um conjunto de instruções ABAP que executam operações no banco de dados central no SAP Web AS ABAP. Os resultados das operações e as mensagens de erro são independentes do sistema de base de dados em uso. Open SQL proporciona assim uma sintaxe e a semântica uniforme para todos os sistemas de base de dados suportadas pela SAP. Programas ABAP que usam apenas instruções Open SQL iram funcionar em qualquer sistema SAP, independentemente do sistema de banco de dados em uso.

O Open SQL fornece uma solução moderna e inteligente para persistir dados nos sistemas SAP, no entanto Open SQL é baseado no paradigma de programação declarativa da linguagem SQL e utiliza os tipos de dados e os Data Objects que definem os tipos de campos do sistema SAP, além de também utilizar o dicionário de dados ABAP para manipular dados. Este modelo apesar de ser eficiente e rápido, se utilizado dentro das melhores praticas, não tratam os dados como objetos assim como os frameworks ORM mais modernos usados atualmente nas linguagens orientadas a objeto como o HibernateRails , Entity Framework e vários outros.

A desvantagem é que o ABAP com o Open SQL não proporciona um modo simples a manipulação dos dados completamente orientados a objetos, não podemos manipular objetos e persisti-los do mesmo modo que os frameworks ORM nos proporcionam e nem utilizar recursos de identificadores automáticos que manipulam objetos do banco de dados como tipos de auto incrementos ou sequencias,  mas podemos utilizar alguns Design Patterns para adaptar esta funcionalidade, o único inconveniente é que este tipo de programação pode gerar margem há uma mistura de paradigmas que pode ocasionar um código de baixa qualidade caso não utilizado conforme seus padrões. Por outro lado os sistemas SAP rodam em um ambiente pré estabelecido e já possuem todos os recursos necessários para que você possa manipular e persistir dados facilmente e você só sentirá falta dos recursos dos modernos dos frameworks ORM apenas se você já os utiliza em outras linguagens de programação.

ABAP: Open SQL

Obs: A SAP nos proporciona um framework de persistência ORM para trabalhar sobre o OpenSQL, veremos sobre estas classes mais adiante.

Persistence: Conceitos de Persistência

Persistindo Dados Com Web Dynpro e Open SQL

Os códigos a seguir utilizam os métodos da View de um modo simples para que seja de fácil entendimento,  a manipulação de dados não estão escritos sob nenhum Design Pattern especifico além do MVC proporcionado pelo Web Dynpro.

1 – Crie uma nova tabela transparente chama ZPARTICIPANTE, crie seus tipos, utilize a figura abaixo para detalhes:

Tabela - Tipos de Campos

Tabela – Tipos de Campos

2 – Defina o tipo de tabela e a quantidade de registros previstos para a tabela:

Maintain Technical Settings

Maintain Technical Settings

3 – Quando finalizar ative sua tabela:

ZPARTICIPANTE - Tabela Transparente

ZPARTICIPANTE – Tabela Transparente

4 – O dicionário de dados e o Open SQL não nos proporcionam nenhum tipo de recurso para manipulação de IDs automáticos, ou objetos do banco de dados, já que não possuímos acesso diretamente a ele. No entanto utilizaremos um objeto chamado NUMBER RANGE.

Numer Range: Number Range Object Types

Entre na transação SNRO e crie um novo objeto chamado ZID_PAR:

Number Range Object

Number Range Object

5 – Em Number Length Domain use, NUM10 e em Warning % use o valor 5 ou o valor de porcentagem que deseja receber avisos quando a faixa estiver chegando ao seu limite. Salve.

Define Parâmetros

Define Parâmetros

6 – Clique em Intervals e crie um novo intervalo:

Intervalos

Intervalos

7 – Adicione a faixa de valores desejados que serão utilizados para criar seus identificadores:

Faixa de valores

Faixa de valores

8 – Crie um novo componente Web Dynpro para os dados da tabela, crie seus atributos no controlador e os use na View. Crie um evento para o botão e um método para gravar dos dados na tabela transparente:

Web Dynpro - Métodos

Web Dynpro – Métodos

9 – Ative seu componente Web Dynpro, e teste sua aplicação:

Web Dynpro - Persistência

Web Dynpro – Persistência

10 – Abra a transação SE16 para acessar o navegador de dados do Netweaver e verifique os dados gravados com sucesso:

Mostra Tabela

Mostra Tabela

Exemplo:

Neste exemplo criamos uma tabela transparente e persistimos dados no banco de dados corrente através do Open SQL.

ABAP

Método Botão – ONACTIONACAO_BOTAO_ENVIAR

method ONACTIONACAO_BOTAO_ENVIAR .

* // Retorna campos do contexto da View
  DATA lo_nd_usuario_controler TYPE REF TO if_wd_context_node.

  DATA lo_el_usuario_controler TYPE REF TO if_wd_context_element.
  DATA ls_usuario_controler TYPE wd_this->Element_usuario_controler.
  DATA lv_cargo TYPE wd_this->Element_usuario_controler-cargo.

* // Recupera node controller
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).

* // Recupera elemento via lead selection
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

* // Recupera atributo
  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `CARGO`
    IMPORTING
      value = lv_cargo ).

* // Define objetos Regex
  DATA:  regex   TYPE REF TO cl_abap_regex,
         matcher TYPE REF TO cl_abap_matcher.

* Cria objeto Regex e define Pattern
  CREATE OBJECT regex
    EXPORTING
      pattern     = '[a-zA-Z]+'.

* // Verifica valot do elemento contra o Pattern
  matcher = regex->create_matcher( text =  lv_cargo ).

* // Verifca Pattern
IF matcher->match( ) NE 'X'.

* // Define menssagem
    data lo_api_controller     type ref to if_wd_controller.
    data lo_message_manager    type ref to if_wd_message_manager.

    lo_api_controller ?= wd_This->Wd_Get_Api( ).

* // Chama método de menssagem
    CALL METHOD lo_api_controller->GET_MESSAGE_MANAGER
      RECEIVING
        MESSAGE_MANAGER = lo_message_manager.

* // Exibe mensagem
    CALL METHOD lo_message_manager->REPORT_MESSAGE
      EXPORTING
        MESSAGE_TEXT      = 'Cargo é exclusivamente um campo alphanumérico'
        CANCEL_NAVIGATION = ABAP_TRUE.
  ENDIF.

* // Gravar dados
wd_this->ONGRAVAR( ).

endmethod.

Método Gravação – ONGRAVAR

method ONGRAVAR .

* // Recupera dados do controlador
  DATA lo_nd_usuario_controler TYPE REF TO if_wd_context_node.

  DATA lo_el_usuario_controler TYPE REF TO if_wd_context_element.
  DATA ls_usuario_controler TYPE wd_this->Element_usuario_controler.
  DATA lv_usuario_login TYPE wd_this->Element_usuario_controler-usuario_login.

  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

*   // Recupera Nome
  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `USUARIO_LOGIN`
    IMPORTING
      value = lv_usuario_login ).

* // Recupera Sobrenome
  DATA lv_sobrenome TYPE wd_this->Element_usuario_controler-sobrenome.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `SOBRENOME`
    IMPORTING
      value = lv_sobrenome ).

* // Recupera Cargo

  DATA lv_cargo TYPE wd_this->Element_usuario_controler-cargo.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `CARGO`
    IMPORTING
      value = lv_cargo ).

* // Recupera Salario
  DATA lv_salario TYPE wd_this->Element_usuario_controler-salario.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `SALARIO`
    IMPORTING
      value = lv_salario ).

* // Recupera Data
  DATA lv_data TYPE wd_this->Element_usuario_controler-data.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `DATA`
    IMPORTING
      value = lv_data ).

* // Recupera Genero
  DATA lv_genero TYPE wd_this->Element_usuario_controler-genero.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `GENERO`
    IMPORTING
      value = lv_genero ).

* // Recupera Ativo
  DATA lv_ativo TYPE wd_this->Element_usuario_controler-ativo.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `ATIVO`
    IMPORTING
      value = lv_ativo ).

* // Recupera Observacao

  DATA lv_observacao TYPE wd_this->Element_usuario_controler-observacao.
  lo_nd_usuario_controler = wd_context->get_child_node( name = wd_this->wdctx_usuario_controler ).
  lo_el_usuario_controler = lo_nd_usuario_controler->get_element( ).

  lo_el_usuario_controler->get_attribute(
    EXPORTING
      name =  `OBSERVACAO`
    IMPORTING
      value = lv_observacao ).

* // Declara variáveis
  DATA : nome         TYPE ZNome,
         sobrenome    TYPE ZSobrenome,
         cargo        TYPE ZCargo,
         salario      TYPE Zsal,
         data_adm     TYPE Zdata,
         genero       TYPE ZGenero,
         ativo        TYPE Zativo,
         observacao   TYPE ZObservacao.

* // Alimenta dados.

  nome       = LV_USUARIO_LOGIN.
  sobrenome  = LV_SOBRENOME.
  cargo      = LV_CARGO.
  salario    = LV_SALARIO.
  data_adm   = LV_DATA.
  genero     = LV_GENERO.
  ativo      = LV_ATIVO.
  observacao = LV_OBSERVACAO.

* // Recupera numero auto-incremento para o ID
  DATA id_participante TYPE I.

  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      nr_range_nr             = '1'
      object                  = 'ZID_PAR'
    IMPORTING
      NUMBER                  = ID_PARTICIPANTE
    EXCEPTIONS
      INTERVAL_NOT_FOUND      = 1
      NUMBER_RANGE_NOT_INTERN = 2
      OBJECT_NOT_FOUND        = 3
      QUANTITY_IS_0           = 4
      QUANTITY_IS_NOT_1       = 5
      INTERVAL_OVERFLOW       = 6
      BUFFER_OVERFLOW         = 7
      OTHERS                  = 8.

* // Cria Set de dados
  DATA participante TYPE ZPARTICIPANTE.

  PARTICIPANTE-ID_PART = ID_PARTICIPANTE.
  PARTICIPANTE-NOME = NOME.
  PARTICIPANTE-SOBRENOME = SOBRENOME.
  PARTICIPANTE-CARGO = CARGO.
  PARTICIPANTE-DATA = DATA_ADM.
  PARTICIPANTE-GENERO = GENERO.
  PARTICIPANTE-ATIVO = ATIVO.
  PARTICIPANTE-OBSERVACAO = OBSERVACAO.

* // Insere dados na tabela
  INSERT INTO ZPARTICIPANTE VALUES PARTICIPANTE.
  IF SY-SUBRC = 0.
* Define menssagem
    data lo_api_controller     type ref to if_wd_controller.
    data lo_message_manager    type ref to if_wd_message_manager.

    lo_api_controller ?= wd_This->Wd_Get_Api( ).

* Chama método de menssagem
    CALL METHOD lo_api_controller->GET_MESSAGE_MANAGER
      RECEIVING
        MESSAGE_MANAGER = lo_message_manager.

* Exibe mensagem
    CALL METHOD lo_message_manager->REPORT_SUCCESS
      EXPORTING
        MESSAGE_TEXT = 'Dados Inseridos com Sucesso'.
  ENDIF.

endmethod.

ASP NET – Persistência – NHibernate – Oracle – C#

Publicado: 12 de fevereiro de 2015 em C#

O NHibernate é uma das soluções de mapeamento objeto-relacional (ORM) para a plataforma de desenvolvimento Microsoft .NET, é um framework que fornece o mapeamento do modelo relacional para a orientação a objeto. O NHibernate é livre e de código aberto e é a versão portada do Java para o Microsoft .NET do Hibernate. Ele lida com plano de persistência para objetos e de um subjacentes de dados relacionais. Dando uma descrição XML de suas entidades e relacionamentos, NHibernate gera automaticamente códigos SQL para carregar e guardar os objetos. Opcionalmente, você pode descrever o seu mapeamento de metadados com atributos em seu código fonte.

O NHibernate suporta persistência transparente, o seu objeto classes não têm de seguir um modelo de programação restritiva. Classes persistentes não precisam implementar nenhuma interface ou herdar de uma classe especial base. Isto torna possível desenvolver a lógica empresarial utilizando o plano de objetos .NET (CLR) e Orientação a Objetos.

NHibernate: http://nhibernate.info/

Persistindo Objetos com o NHibernate no Oracle Database

1 – Crie um projeto ASP.NET do tipo C# Empty, crie uma página chamada de default.aspx e resultado.aspx, utilize os códigos correspondentes abaixo. Baixe o NHibernate do link acima e o descompacte em uma pasta, abra a pasta Required_bins e referencie os Assemblers ao seu projeto:

NHibernate - Referencia

NHibernate – Referencia

OBS: Utilize o mesmo processo para o Driver de conexão chamado ODAC 12cOracle DataAccess para .NET, você encontra exemplos nos posts anteriores.

2 – Crie um novo arquivo XML chamado hibernate.cfg.xml na raiz do seu projeto:

NHibernate - Configuração

NHibernate – Configuração

3 – Crie mais um arquivo XML desta vez para mapear o objeto de dados e modelo (Domain) chamado ParticipanteModelo.hbm.xml. Com o arquivo criado, o selecione e em sua propriedade Build Action escolha Embedded Resource. Com o arquivo aberto no editor, selecione o esquema para o arquivo através da propriedade Schemas, o esquema se encontra na mesma pasta das referencias para o NHibernate:

NHibernate - Mapping - Schema

NHibernate – Mapping – Schema

4 – Utilize as classes e arquivos de configurações abaixo e rode o programa. O C# é muito similar ao Java e o NHibernate funciona bem sobre o Design Patter J2EE chamado DAO, onde utiliza o Pattern Factory Method para criar a fabrica de conexão. Apesar do C# utilizar o mesmo Design Pattern na pratica, com os mesmos objetos, toda a nomenclatura da Microsoft é diferente:

JSF - NHibernate - Oracle

ASP.NET – NHibernate – Oracle

5 – Após enviar os dados eles serão persistidos no Oracle Database e um pagina de resultado será exibida:

JSF - ORM - Oracle Database

ASP.NET – ORM – Oracle Database

Exemplo:

Neste exemplo criamos uma página ASP.NET, cujo através do NHibernate persiste dados no banco de dados Oracle Database.

Oracle – PL/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 
);

Web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>

  <appSettings>
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
  </appSettings>

</configuration>

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property>
    <property name="connection.connection_string">
      User Id=user;
      Password=pass;
      Data Source=XE;
      Pooling=true;
      Enlist=false;
      Statement Cache Size=50;
      Min Pool Size=10;
      Incr Pool Size=5;
      Decr Pool Size=2;
    </property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

Participante

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001
{
    public class Participante
    {

        // Declara atributos publicos
        private long id;
        private string nome;
        private string sobrenome;
        private string cargo;
        private DateTime data;
        private double salario;
        private string genero;
        private Boolean ativo;
        private string observacao;

       // Declara propriedades
        public long Id
        {
            get { return id; }
            set { id = value; }
        }

        public string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        public string Sobrenome
        {
            get { return sobrenome; }
            set { sobrenome = value; }
        }

        public string Cargo
        {
            get { return cargo; }
            set { cargo = value; }
        }

        public DateTime Data
        {
            get { return data; }
            set { data = value; }
        }

        public double Salario
        {
            get { return salario; }
            set { salario = value; }
        }

        public string Genero
        {
            get { return genero; }
            set { genero = value; }
        }

        public Boolean Ativo
        {
            get { return ativo; }
            set { ativo = value; }
        }

        public string Observacao
        {
            get { return observacao; }
            set { observacao = value; }
        }
    }
}

ParticipanteModelo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001.Models
{
    public class ParticipanteModelo
    {
        // Declara atributos publicos
        private int id_part;
        private string nome;
        private string sobrenome;
        private string cargo;
        private DateTime data_admissao;
        private double salario;
        private string genero;
        private string ativo;
        private string observacao;

        // Declara propriedades
        public virtual int Id_Part
        {
            get { return id_part; }
            set { id_part = value; }
        }

        public virtual string Nome
        {
            get { return nome; }
            set { nome = value; }
        }

        public virtual string Sobrenome
        {
            get { return sobrenome; }
            set { sobrenome = value; }
        }

        public virtual string Cargo
        {
            get { return cargo; }
            set { cargo = value; }
        }

        public virtual DateTime Data_Admissao
        {
            get { return data_admissao; }
            set { data_admissao = value; }
        }

        public virtual double Salario
        {
            get { return salario; }
            set { salario = value; }
        }

        public virtual string Genero
        {
            get { return genero; }
            set { genero = value; }
        }

        public virtual string Ativo
        {
            get { return ativo; }
            set { ativo = value; }
        }

        public virtual string Observacao
        {
            get { return observacao; }
            set { observacao = value; }
        }
    }
}

Mapping – ParticipanteModelo.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="DAWebApp001"
                   namespace="DAWebApp001.Models">

  <class name="ParticipanteModelo" table="PARTICIPANTE">
    <id name="Id_Part" column="ID_PART">
      <generator class="native" >
        <param name="sequence">SEQ_PARTICIPANTE</param>
      </generator>
    </id>
    <property name="Nome"  column="NOME"/>
    <property name="Sobrenome" column="SOBRENOME"/>
    <property name="Cargo" column="CARGO" />
    <property name="Data_Admissao" column="DATA_ADMISSAO" />
    <property name="Salario" column="SALARIO"/>
    <property name="Genero" column="GENERO" />
    <property name="Ativo" column="ATIVO"/>
    <property name="Observacao" column="OBSERVACAO" />
  </class>

</hibernate-mapping>

ParticipanteRepository

using DAWebApp001.Models;
using NHibernate;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DAWebApp001
{
    public class ParticipanteRepository
    {
        public void Add(ParticipanteModelo participante)
        {
            // Cria sessão
            using (ISession session = DbConexaoFactory.OpenSession())
            {
                // Cria transação
                using (ITransaction transaction = session.BeginTransaction())
                {
                    // Salva e finaliza
                    session.Save(participante);
                    transaction.Commit();
                }
            }
        }
    }
}

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DAWebApp001._default" %>


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Desenvolvimento Aberto</title>
    <style type="text/css">
        .auto-style2 {
            width: 14%;
        }

        .auto-style3 {
            height: 23px;
        }

        .auto-style5 {
            width: 248px;
        }

        .auto-style6 {
            width: 54%;
        }

        .auto-style8 {
            height: 23px;
            width: 54%;
        }

        .auto-style9 {
            height: 23px;
            width: 248px;
        }
    </style>

</head>
<body>
    <h1>Desenvolvimento Aberto - ASP.NET</h1>
    <h2>Cadastro - Controles - NHibernate - Oracle Database -  ASP.NET</h2>
    <form id="form1" runat="server">
        <div>
            <fieldset style="padding: 20px">
                <legend style="padding: 5px">Cadastro</legend>
                <table style="width: 100%;">
                    <tr>
                        <td class="auto-style3" colspan="2">
                            <asp:Label ID="LabelMenssagem" runat="server" Text="Entre com os dados abaixo:"></asp:Label>
                        </td>
                        <td class="auto-style8"></td>
                    </tr>
                    <tr>
                        <td class="auto-style2">
                            <asp:Label ID="Label2" runat="server" Text="Nome:"></asp:Label>
                        </td>
                        <td class="auto-style5">
                            <asp:TextBox ID="TextBox1nome" onMouseOver="meuMouseOver()" onMouseOut="meuMouseOut()" runat="server" Width="142px"></asp:TextBox>
                        </td>
                        <td class="auto-style6">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1nome" ErrorMessage="Nome é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1nome" ErrorMessage="Permitido somente caractere  alphanumericos" ForeColor="Red" ValidationExpression="[a-zA-Z]+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label3" runat="server" Text="Sobrenome:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox2sobrenome" runat="server" Width="240px"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TextBox2sobrenome" ErrorMessage="Sobrenome é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ControlToValidate="TextBox2sobrenome" ErrorMessage="Permitido somente caractere  alphanumericos" ForeColor="Red" ValidationExpression="[a-zA-Z]+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label4" runat="server" Text="Cargo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:DropDownList ID="DropDownList1" runat="server" Height="16px" Width="211px">
                                <asp:ListItem></asp:ListItem>
                                <asp:ListItem>Vocalista</asp:ListItem>
                                <asp:ListItem>Guitarrista</asp:ListItem>
                                <asp:ListItem>Baixista</asp:ListItem>
                                <asp:ListItem>Baterista</asp:ListItem>
                            </asp:DropDownList>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="DropDownList1" ErrorMessage="Cargo é obrigatório." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" ControlToValidate="DropDownList1" ErrorMessage="Permitido somente caractere  alphanumericos" ForeColor="Red" ValidationExpression="[a-zA-Z]+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label6" runat="server" Text="Data de Admissão:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox1Data" runat="server" Width="177px"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="TextBox1Data" ErrorMessage="Data de admissão é obrigatória." ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator5" runat="server" ControlToValidate="TextBox1Data" ErrorMessage="Formato de data invalido, use (dd/mm/yyyy)." ForeColor="Red" ValidationExpression="^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label5" runat="server" Text="Salário:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox4salario" runat="server"></asp:TextBox>
                        </td>
                        <td class="auto-style8">
                            <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="TextBox4salario" ErrorMessage="Salário é obrigatório. " ForeColor="Red" ValidationGroup="AllValidator"></asp:RequiredFieldValidator>
                            <br />
                            <asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" ControlToValidate="TextBox4salario" ErrorMessage="Permitido somente caractere  numericos e decimais." ForeColor="Red" ValidationExpression="(?:\d*\.)?\d+" ValidationGroup="AllValidator"></asp:RegularExpressionValidator>
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label7" runat="server" Text="Sexo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:RadioButton ID="RadioButton1" runat="server" GroupName="Grupo1" Text="Masculino" />
                            <asp:RadioButton ID="RadioButton2" runat="server" GroupName="Grupo1" Text="Feminino" />
                        </td>
                        <td class="auto-style8">
                            <br />
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label8" runat="server" Text="Ativo:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:CheckBox ID="CheckBox1" runat="server" Text="Cadastro Valido" />
                        </td>
                        <td class="auto-style8">
                            <br />
                        </td>
                    </tr>
                    <tr>
                        <td class="auto-style3">
                            <asp:Label ID="Label9" runat="server" Text="Observação:"></asp:Label>
                        </td>
                        <td class="auto-style9">
                            <asp:TextBox ID="TextBox1Observacao" runat="server" Columns="40" Rows="5" TextMode="MultiLine"></asp:TextBox>
                        </td>
                        <td class="auto-style8">&nbsp;</td>
                    </tr>
                    <tr>
                        <td class="auto-style3" colspan="3">
                            <hr />
                            &nbsp;</td>
                    </tr>
                    <tr>
                        <td class="auto-style3">

                            <asp:Button ID="Button1enviardados" runat="server" Text="Enviar Dados" OnClick="Button1enviardados_Click" ValidationGroup="AllValidator" />
                        </td>
                        <td class="auto-style9">&nbsp;</td>
                        <td class="auto-style8">&nbsp;</td>
                    </tr>
                </table>
            </fieldset>
        </div>
    </form>
</body>
</html>

Default.aspx.cs

using DAWebApp001.Models;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace DAWebApp001
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Participante participante = new Participante();

            Session["Cadastro"] = participante;

        }

        protected void Button1enviardados_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                // Recupera objeto da Session
                Participante cad = (Participante)Session["Cadastro"];

                // Valor normalmente é um autoincremento
                // Ou pelo banco Identity (MSSQL) Sequence (Oracle, DB2, etc)
                // Ou algum framework ORM - NUNCA faça um autoincremento manualmente na aplicação
                cad.Id = 1;

                // Alimenta Objeto
                cad.Nome = TextBox1nome.Text;
                cad.Sobrenome = TextBox2sobrenome.Text;
                cad.Cargo = DropDownList1.Text;
                cad.Data = DateTime.Parse(TextBox1Data.Text);
                cad.Salario = Double.Parse(TextBox4salario.Text);

                // Verifica valores boleanos
                if (RadioButton1.Checked)
                {
                    cad.Genero = RadioButton1.Text;
                }

                if (RadioButton2.Checked)
                {
                    cad.Genero = RadioButton2.Text;
                }

                cad.Ativo = CheckBox1.Checked;
                cad.Observacao = TextBox1Observacao.Text;
                                
                // Carrega configuração do NHibernate
                LoadNHibernateCfg();

                // Objeto de transferencia
                transfereParticipante(cad);

                // Redireciona pagina
                Response.Redirect("resultado.aspx");

            }

        }

        private static void transfereParticipante(Participante participante)
        {
            // Define repositorio
            ParticipanteRepository repositorio = new ParticipanteRepository();

            // Define Modelo
            ParticipanteModelo modelo = new ParticipanteModelo();

            // Transfere objeto para o Modelo (Domain)
            // objeto de transferncia é util quando vc tem 
            // que converter o tipo de dados antes de gravar
            
            modelo.Nome = participante.Nome;
            modelo.Sobrenome = participante.Sobrenome;
            modelo.Cargo = participante.Cargo;
            modelo.Data_Admissao = participante.Data;
            modelo.Salario = participante.Salario;
            modelo.Genero = participante.Genero;
            modelo.Ativo = participante.Ativo.ToString();
            modelo.Observacao = participante.Observacao;

            repositorio.Add(modelo);

        }

        private static void LoadNHibernateCfg()
        {
            // Carrega configuração NHibernate
            var cfg = new Configuration();
            cfg.Configure();
            cfg.AddAssembly(typeof(ParticipanteModelo).Assembly);
            
        }
    }
}

Resultado.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="resultado.aspx.cs" Inherits="DAWebApp001.resultado" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .auto-style1 {
            width: 143px;
        }

        .auto-style2 {
            width: 143px;
            height: 23px;
        }

        .auto-style3 {
            height: 23px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h1>Desenvolvimento Aberto - ASP.NET</h1>
            <h2>Cadastro - Controles - ASP.NET - NHibernate - Oracle Database</h2>
            <h3>Dados Gravados com sucesso:</h3>

            <table style="width: 100%;">
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label1" runat="server" Text="Nome:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lnome" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label2" runat="server" Text="Sobrenome:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lsobrenome" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style2">
                        <asp:Label ID="Label3" runat="server" Text="Cargo:"></asp:Label>
                    </td>
                    <td class="auto-style3">
                        <asp:Label ID="Lcargo" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td class="auto-style3"></td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label4" runat="server" Text="Data de Admissão:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="ldata" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label5" runat="server" Text="Salário:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lsalario" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label6" runat="server" Text="Sexo:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lgenero" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style2">
                        <asp:Label ID="Label7" runat="server" Text="Ativo:"></asp:Label>
                    </td>
                    <td class="auto-style3">
                        <asp:Label ID="lativo" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td class="auto-style3"></td>
                </tr>
                <tr>
                    <td class="auto-style1">
                        <asp:Label ID="Label8" runat="server" Text="Observação:"></asp:Label>
                    </td>
                    <td>
                        <asp:Label ID="lobservacao" runat="server" Text="Label"></asp:Label>
                    </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td class="auto-style1">&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
            </table>
            <br />

        </div>
    </form>
</body>
</html>

Resultado.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DAWebApp001
{
    public partial class resultado : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            // Recupera objeto
            Participante cad = (Participante)Session["Cadastro"];

            if (Session["Cadastro"] != null)
            {
                // Alimemta valores
                lnome.Text = cad.Nome;
                lsobrenome.Text = cad.Sobrenome;
                Lcargo.Text = cad.Cargo;
                ldata.Text = cad.Data.ToString();
                lsalario.Text = cad.Salario.ToString();
                lgenero.Text = cad.Genero;
                lativo.Text = cad.Ativo.ToString();
                lobservacao.Text = cad.Observacao;
            }

        }
    }
}

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>

JQuery UI – Elementos – Javascript

Publicado: 9 de fevereiro de 2015 em JavaScript, JQuery

O JQuery UI permite que você utilize os elementos de interface gráfica de usuário comuns da linguagem de marcação HTML e os ligue aos elementos de sua biblioteca visual, deste modo você pode você se beneficiar de todos os efeitos visuais e recursos dos componentes modernos que o JQuery UI fornece para que você construa aplicações web altamente interativas, além de possibilitar a manipulação dos elementos de um página web de uma forma simples e fácil, utilizando a biblioteca JQuery.

Utilizando Elementos do JQuery UI

1 – Crie uma pagina HTML para o cadastro e outra para a exibição do resultado e utilize os códigos abaixo para criar sua aplicação. Entre com os dados e clique no botão para envia-los:

JQuery UI - Elementos

JQuery UI – Elementos

2 – A pagina de resultado recupera e exibe os parâmetros enviados através de Javascript e JQuery:

JQuery - Resultado

JQuery – Resultado

Exemplo:

Neste exemplo criamos um cadastro utilizando os elementos HTML e os ligando ao JQuery UI.

JQuery

index.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="Bluefish 2.2.6" />
<meta charset="utf-8" />
<title>Desenvolvimento Aberto</title>

<style type="text/css">
body {
	font: 62.5% "Trebuchet MS", sans-serif;
	margin: 50px;
}

#meucheck, #genero {
	font: 62.5% "Trebuchet MS", sans-serif;
	margin-top: 1em;
	width: 50px;
}

#cargo {
	width: 300px;
}

#cadastro label {
	width: 250px;
}

#cadastro label.error, #cadastro input.submit {
	color: darkorange;
	margin-left: 253px;
}
</style>
<!-- 
         Está é uma instalação do JQuery, você apenas precisa apontar
         para o respectivo script da versão que você deseja utilizar
                  
         jquery.js     = JQuery
         jquery-ui.js  = JQuery UI     
         jquery-ui.css = JQuery Theme    
    -->
<link href="./jquery-ui-1.11.2.custom/jquery-ui.css" rel="stylesheet"
	type="text/css" />
<script type="text/javascript"
	src="./jquery-ui-1.11.2.custom/external/jquery/jquery.js">
	
</script>
<script type="text/javascript"
	src="./jquery-ui-1.11.2.custom/jquery-ui.js">
	
</script>

<!-- JQuery Validator -->

<script type="text/javascript"
	src="./js/jquery-validation-1.13.1/dist/jquery.validate.js"></script>

<!-- Script JQuery - JQuery UI -->

<script type="text/javascript">
	// Declara UI e funções JQuery

	$(document).ready(function() {

		// Método de validação    
		$.validator.addMethod("regex", function(value, element, regexp) {
			var re = new RegExp(regexp);
			return this.optional(element) || re.test(value);
		}, "Please check your input.");

		// Cria regras de valicação e customiza mensagens

		$("#cadastro").validate({
			rules : {
				nome : {
					required : true,
					regex : /[a-zA-Z]+/
				},
				sobrenome : {
					required : true,
					regex : /[a-zA-Z]+/
				},
				cargo : {
					required : true,
					regex : /[a-zA-Z]+/
				},
				datepicker : {
					required : true
				},
				salario : {
					required : true,
					regex : /(?:\d*\.)?\d+/
				},

			},

			messages : {
				nome : {
					required : "O campo nome é obrigatório.",
					regex : "Campo suporta somente letras"
				},
				sobrenome : {
					required : "O campo sobrenome é obrigatório.",
					regex : "Campo suporta somente letras"
				},
				cargo : {
					required : "O campo cargo é obrigatório.",
					regex : "Campo suporta somente letras"
				},

				datepicker : {
					required : "O campo data é obrigátorio"
				},

				salario : {
					required : "O campo salário é obrigatório.",
					regex : "Campo suporta somente decimais"
				},
			},
		});

		$("#accordion").accordion({
			heightStyle : "content"
		}).accordion("option", "icons", null)

		$("#datepicker").datepicker();

		$("#genero").buttonset().find('label').width(100);

		$("#meucheck").buttonset().find('label').width(100);

		$("#abrir").button()

	});
</script>
</head>
<body>
	<h1>Desenvolvimento Aberto - JQuery - UI</h1>

	<h2>Form Validator - Validação</h2>
	<div id="accordion">
		<h3>Cadastro</h3>
		<div>
			<form id="cadastro" method="get" action="resultado.html">
				<table>
					<tr>
						<td><label for="nome">Nome:</label></td>
						<td><input id="nome" name="nome" size="27" required>
							<br></td>
					</tr>

					<tr>
						<td><label for="sobrenome">Sobrenome:</label></td>
						<td><input id="sobrenome" name="sobrenome" size="35" required>
							<br></td>
					</tr>

					<tr>
						<td><label for="cargo">Cargo:</label></td>
						<td><select id="cargo" name="cargo" required>
								<option value="Vocalista">Vocalista</option>
								<option value="Guitarrista">Guitarrista</option>
								<option value="Baixista">Baixista</option>
								<option value="Baterista">Baterista</option>
						</select>
					</tr>

					<tr>
						<td><label for="datepicker">Data de admissão:</label></td>
						<td><input type="text" id="datepicker" name="data" required></td>
					</tr>

					<tr>
						<td><label for="salario">Salario:</label></td>
						<td><input id="salario" name="salario" size="18" required>
							<br></td>
					</tr>

					<tr>
						<td><label for="genero">Gênero:</label></td>
						<td>
							<div id="genero">
								<input type="radio" id="radio1" name="genero"><label
									for="radio1">Masculino</label> <input type="radio" id="radio2"
									name="genero"><label for="radio2">Feminino</label>
							</div>
						</td>

					</tr>
					<tr>
						<td><label>Ativo:</label></td>
						<td><div id="meucheck">
								<input type="checkbox" id="ativo" name="ativo"><label
									for="ativo">Situação</label>
							</div></td>
					</tr>

					<tr>

						<td><label for="observacao">Observação:</label></td>
						<td><textarea id="observacao" name="observacao" rows="5"
								cols="40"></textarea></td>

					</tr>

				</table>
				<br>
				<button id="abrir" type="submit">Enviar Dados</button>
			</form>
		</div>
	</div>

</body>
</html>

resultado.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="Bluefish 2.2.6" />
<meta charset="utf-8" />
<title>Desenvolvimento Aberto</title>

<style type="text/css">
body {
	font: 62.5% "Trebuchet MS", sans-serif;
	margin: 50px;
}

.rotulo {
	font: 62.5% "Trebuchet MS", sans-serif;
	color: darkorange;
	font-weight: bold;
}

.dados {
	font: 62.5% "Trebuchet MS", sans-serif;
	color: cadetblue;
}
</style>
<!--
         Está é uma instalação do JQuery, você apenas precisa apontar
         para o respectivo script da versão que você deseja utilizar

         jquery.js     = JQuery
         jquery-ui.js  = JQuery UI
         jquery-ui.css = JQuery Theme
    -->
<link href="./jquery-ui-1.11.2.custom/jquery-ui.css" rel="stylesheet"
	type="text/css" />
<script type="text/javascript"
	src="./jquery-ui-1.11.2.custom/external/jquery/jquery.js">

</script>
<script type="text/javascript"
	src="./jquery-ui-1.11.2.custom/jquery-ui.js">

</script>

<!-- Script JQuery - JQuery UI -->

<script type="text/javascript">
	// Declara UI e funções JQuery

	$(document).ready(function() {

		// Cria função para recuperar paramentros

		$("#accordion").accordion({
			heightStyle : "content"
		}).accordion("option", "icons", null);

		function getUrlParameter(sParam) {
			var sPageURL = window.location.search.substring(1);
			var sURLVariables = sPageURL.split('&');
			for (var i = 0; i < sURLVariables.length; i++) {
				var sParameterName = sURLVariables[i].split('=');
				if (sParameterName[0] == sParam) {
					return sParameterName[1];
				}
			}
		}
		// Está é a URL
		// ?nome=Eddie&sobrenome=Vedder&cargo=Vocalista&data=02%2F09%2F2015&salario=1234.56&genero=on&ativo=on&observacao=teste

		// Recupera parametros

		var nome = getUrlParameter('nome');
		var sobrenome = getUrlParameter('sobrenome');
		var cargo = getUrlParameter('cargo');
		var dataAdmissao = getUrlParameter('data');
		var salario = getUrlParameter('salario');
		var genero = getUrlParameter('genero');
		var ativo = getUrlParameter('ativo');
		var observacao = getUrlParameter('observacao');

		// Mostra valores
		$("#nome").html(nome);
		$("#sobrenome").html(sobrenome);
		$("#cargo").html(cargo);
		$("#dataAdmissao").html(unescape(dataAdmissao));
		$("#salario").html("R$ " + salario);
		$("#genero").html(genero);
		$("#ativo").html(ativo);
		$("#observacao").html(unescape(observacao));

	});
</script>
</head>
<body>
	<h1>Desenvolvimento Aberto - JQuery - UI</h1>

	<h2>Form UI - Resultado - GET</h2>
	<div id="accordion">
		<h3>Resultado</h3>

		<div>

			<table>
				<tr>
					<td class="rotulo">Nome:</td>
					<td><label id="nome" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Sobrenome:</td>
					<td><label id="sobrenome" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Cargo:</td>
					<td><label id="cargo" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Data de Admissão:</td>
					<td><label id="dataAdmissao" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Salário:</td>
					<td><label id="salario" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Gênero:</td>
					<td><label id="genero" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Ativo:</td>
					<td><label id="ativo" class="dados"></label></td>
				</tr>

				<tr>
					<td class="rotulo">Observação:</td>
					<td><label id="observacao" class="dados"></label></td>
				</tr>

			</table>

		</div>

	</div>
</body>
</html>

Web Dynpro – UI Elements – SAP – Abap

Publicado: 7 de fevereiro de 2015 em Abap

O Web Dynpro fornece várias categorias com elementos de interface de usuário e estes elementos estão disponíveis no explorador Web Dynpro através de sua caixa de ferramentas em uma interface RAD para que você possa criar seu layout de um modo simples e fácil. Estes elementos da interface padrão incluem botões, etiquetas, campos de entrada e vários outros elementos.

Como sabemos podemos facilmente utilizar os dados entrados por qualquer interface e grava-los em uma tabela do banco de dados utilizando o dicionário ABAP e o Open SQL. Entretanto a linguagem de programação ABAP não possui Arrays no sentido clássico da palavra, então para que possamos popular as propriedades dos elementos que exigem um índice e valores simples criados manualmente como os ComboBox, Radio Buttons ou outros elementos da interface gráfica como normalmente é utilizado em qualquer outra linguagem de programação, precisamos recorrer a um recurso que os domínios do dicionário ABAP nos disponibilizam chamados de Fixed Values.

Os Fixed Values são faixas de valores de um domínio que especificam uma faixa de valores e podem ser ainda mais restritas, definindo apenas valores fixos. Dos valores fixos definidos para um domínio, estes são utilizados na verificação de entrada de dados em modelos de triagem nos elementos de tela. Você pode criar os valores fixos diretamente na criação de um domínio ou dinamicamente através de código ABAP.

Fixed Values: Valores fixos dos Atributos.

Utilizando os Elementos da UI Web Dynpro

1 – Primeiro precisamos criar um domínio para os elementos de valores fixos que serão utilizados como as tradicionais Arrays para popular os elementos da UI. Entre na transação SE11 e crie um Domain para campo de caixa de escolha no qual utilizaremos na pagina web, este elemento na UI será do tipo DropDownByKey:

Domain - DropDownByKey

Domain – DropDownByKey

2 – Na aba Value Range você pode alimentar os valores fixos ou cria-los manualmente através de código dinâmico:

Value Range - DropDownByKey

Value Range – DropDownByKey

3 – Após criar e ativar o domínio, crie um novo Data Type para a caixa de seleção utilizando o domínio criado, neste caso você pode utilizar o mesmo nome para o Domain e Data Type:

Data Type - DropDownByKey

Data Type – DropDownByKey

OBS: Repita os passos 1 ao 3 para o de botão de radio onde utilizaremos o elemento da UI chamado RadioButtonGroupByKey:

4 – Crie um novo componente Web Dynpro e para o seu controlador crie um node e os atributos para os campos da interface de usuário, você pode utilizar os tipos do ABAP e os Data Types criados acima para manipular os seus atributos. Neste exemplo utilizamos String para os campos Nome, Sobrenome, Salário e Observação. Os Data Types criados acima para os campos Cargo e Gênero, o tipo d para a Data de Admissão e Abap_bool para o campo Ativo:

Controller - Atributos

Controller – Atributos

5 – Crie um layout baseado na figura abaixo, link os atributos do controlador nos atributos de sua View e os ligue aos seus respectivos elementos através de suas propriedades:

View - Layout

View – Layout

6 – Salve e ative seu componente Web Dynpro, crie uma aplicação e a teste. Você pode utilizar uma nova View para exibir os valores dos atributos ou grava-los em uma tabela Z transparente que você também pode criar. Utilize o evento clique do botão para exibir a visão de resultado ou gravar os dados no banco de dados.

Web Dynpro - Aplicação

Web Dynpro – Aplicação

Exemplo:

Neste exemplo utilizamos o paradigma declarativo da interface do Web Dynpro para criar uma pagina web com os elementos básicos de entrada disponíveis pela UI do Web Dynpro. Você encontra os detalhes de como realizar cada procedimento utilizado acima para criar o layout e os elementos básicos da UI nos exemplos anteriores.