Tutorial com exemplo de integração Vaadin + Hibernate utilizando a classe HbnContainer

Em: Java

22 fev 2010

Neste tutorial irei apresentar um exemplo de como alimentar uma listagem (componente Table) do Vaadin simplesmente configurando seu DataSource como sendo uma classe-entidade do Hibernate.

Utilizaremos uma classe bastante interessante chamada HbnContainer, que está na incubadora, portanto, ainda não faz parte do core do Vaadin. Baixe-a neste link e junte ao código-fonte do seu projeto.

Primeiro adicione o seguite código ao método init() da sua classe Application (AlunosApplication, no meu caso), ele irá gerenciar as sessões do Hibernate, fechando-as no final de cada transação:

public class AlunosApplication extends Application implements SessionManager {
    @Override
    public void init() {
        getContext().addTransactionListener(new TransactionListener() {
            @Override
            public void transactionEnd(Application application, Object transactionData) {
                if (application == BiometriaApplication.this) {
                    closeSession();
                }
            }
 
            @Override
            public void transactionStart(Application application, Object transactionData) {
 
            }
        });
    }

Faça com que a sua classe Application implemente a interface SessionManager, que pertence a HbnContainer. Em seguida, adicione a ela os seguintes métodos:

    /**
     * Retorna a sessão atual do Hibernate. 
     * Também assegura uma transação aberta do Hibernate.
     */
    public Session getSession() {
        Session currentSession = HibernateUtil.getSessionFactory().getCurrentSession();
        if(!currentSession.getTransaction().isActive()) {
            currentSession.beginTransaction();
        }
        return currentSession;
    }
 
    private void closeSession() {
        Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
        if(sess.getTransaction().isActive()) {
            sess.getTransaction().commit();
        }
        if (sess.isOpen()) sess.close();
    }

A classe HibernateUtil, citada no código acima, irá nos fornecer as sessões do Hibernate:

package net.rubensgadelha.alunos.util;
 
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
 
public class HibernateUtil {
    private static final SessionFactory sessionFactory;
 
    static {
        try {
            // Cria o SessionFactory com base no arquivo hibernate.cfg.xml
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	} catch (Throwable ex) {
            System.err.println("Falha na inicialização da SessionFactory: " + ex);
            throw new ExceptionInInitializerError(ex);
	}
    }
 
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Agora que já concluímos o ambiente Vaadin + Hibernate, criemos a classe mapeada pelo Hibernate:

package net.rubensgadelha.alunos.bean;
 
import java.io.Serializable;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
 
@SuppressWarnings("serial")
@Entity
@Table(name="alunos")
public class Aluno implements Serializable {
 
    @Id
    private Long oid;
 
    @Column(name="matricula", nullable=false, length=5)
    @NotNull
    private Integer matricula;
 
    @Column(name="nome")
    @NotNull @Length(min=5, max=50)
    private String nome;
 
    @Column(name="email")
    private String email;
 
    public void setOid(Long oid) {
        this.oid = oid;
    }
 
    public Long getOid() {
        return oid;
    }
 
    public void setMatricula(Integer matricula) {
        this.matricula = matricula;
    }
 
    public Integer getMatricula() {
        return matricula;
    }
 
    public String getNome() {
        return nome;
    }
 
    public void setNome(String nome) {
        this.nome = nome;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
}

Finalmente, informamos que a classe acima, que representa uma tabela no banco de dados, irá popular a tabela do Vaadin representada na classe abaixo:

package net.rubensgadelha.alunos.ui;
 
import net.rubensgadelha.alunos.AlunosApplication;
import net.rubensgadelha.alunos.bean.Aluno;
import net.rubensgadelha.alunos.util.HbnContainer;
 
import com.vaadin.ui.Table;
 
@SuppressWarnings("serial")
public class TabelaAlunos extends Table {
 
    public ListaAlunos(AlunosApplication app) {
        HbnContainer hbn = new HbnContainer(Aluno.class, app);
        setContainerDataSource(hbn);
    }
}

Pronto! Agora basta que você adicione o componente acima na sua aplicação e você verá que ele será automaticamente populado com os dados do banco.

5 Respostas para Tutorial com exemplo de integração Vaadin + Hibernate utilizando a classe HbnContainer

Avatar

Arthur

abril 15th, 2010 às 09:03

Amigo, tentei fazer o que vc disse no passo-a-passo essa integração do hibernate com o vaadin. Eu já possuia antes um projeto que ja estava todo mapiado e ok. Só que ele não era web. Quando coloquei pra integrar com o vaadin aparece a mensagem de erro que não foi possível achar a classe Session. O que faço ? Abraço. Se puder responde pelo meu email.

Avatar

Jonathan Welzel

maio 3rd, 2010 às 11:57

Ótimo tutorial. Já tinha visto um exemplo baseado nesse padrão de gerenciamento de sessões por requisição com Hibernate+Vaadin, mas até agora esse aqui foi oq eu mais gostei.

Avatar

Percival

maio 3rd, 2010 às 18:58

Olá tenho algumas duvidas, sou novo em vaadin e seu post esta bom, mas “BiometriaApplication” que referencia é esta.

“public void transactionEnd(Application application, Object transactionData) {
if (application == BiometriaApplication.this) {
closeSession();
}
}

Avatar

Sergio

junho 16th, 2010 às 08:02

Excelente!!! muy buen trabajo, pero sería bueno tener un link con la descarga completa.

Gracias!!

Avatar

Sergio

junho 16th, 2010 às 08:03

Excelente! trabalho muito bom, mas seria bom ter um link para o download completo.
Obrigado!

Comentário

Sobre o autor

Rubens Gadelha é formado em Webdesign & Webmaster (hoje Desenvolvimento de Web e Comércio Eletrônico) pela Universidade Estadual Vale do Acaraú - UVA e dedica algumas horas do dia à boa leitura e autodidática.

Atualmente trabalha como Programador Web, focado na linguagem PHP e no Zend Framework, bibliotecas de javascript como JQuery e o uso de CMS’s como Drupal. Os bancos de dados MySQL e PostGres também fazem parte do seu dia-a-dia.

Dedica suas horas vagas ao aprofundamento na linguagem Java

Categorias

Arquivos

  • Sergio: Excelente! trabalho muito bom, mas seria bom ter um link para o download completo. Obrigado! [...]
  • Sergio: Excelente!!! muy buen trabajo, pero sería bueno tener un link con la descarga completa. Gracias! [...]
  • Percival: Olá tenho algumas duvidas, sou novo em vaadin e seu post esta bom, mas "BiometriaApplication" que r [...]
  • Jonathan Welzel: Ótimo tutorial. Já tinha visto um exemplo baseado nesse padrão de gerenciamento de sessões por r [...]
  • Arthur: Amigo, tentei fazer o que vc disse no passo-a-passo essa integração do hibernate com o vaadin. Eu [...]