Em: Java
22 fev 2010Neste 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.
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
5 Respostas para Tutorial com exemplo de integração Vaadin + Hibernate utilizando a classe HbnContainer
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.
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.
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();
}
}
“
Sergio
junho 16th, 2010 às 08:02
Excelente!!! muy buen trabajo, pero sería bueno tener un link con la descarga completa.
Gracias!!
Sergio
junho 16th, 2010 às 08:03
Excelente! trabalho muito bom, mas seria bom ter um link para o download completo.
Obrigado!