{"id":23,"date":"2010-03-17T19:11:04","date_gmt":"2010-03-17T22:11:04","guid":{"rendered":"http:\/\/www.javaframework.org\/portal\/2010\/03\/17\/iniciando-com-hibernate-3-utilizando-annotations\/"},"modified":"2010-03-17T19:11:04","modified_gmt":"2010-03-17T22:11:04","slug":"iniciando-com-hibernate-3-utilizando-annotations","status":"publish","type":"post","link":"https:\/\/www.javaframework.org\/portal\/2010\/03\/17\/iniciando-com-hibernate-3-utilizando-annotations\/","title":{"rendered":"Iniciando com Hibernate 3 utilizando Annotations"},"content":{"rendered":"<p>O Hibernate \u00e9 um dos mais famosos frameworks de persistencia. Um framework de persistencia \u00e9 uma ferramenta que ajudar\u00e1 a persistir, ou seja, salvar, os seus dados em algum local, um banco de dados por exemplo. O Hibernate faz o mapeamento das classes de sua aplica\u00e7\u00e3o em tabelas e colunas do banco de dados. Com isso \u00e9 poss\u00edvel ler e salvar objetos no banco de forma transparente. Nesse tutorial aprenderemos a configurar um projeto b\u00e1sico com Hibernate e utilizaremos Annotations para fazer a configura\u00e7\u00e3o das classes.<\/p>\n<p> <!--more-->  <\/p>\n<p>O primeiro passo para fazermos um projeto com Hibernate, \u00e9 definir qual \u00e9 a estrutura de classes iremos utilizar. Depois, criaremos as tabelas de acordo com essas classes, e faremos o mapeamento no hibernate. Essas classes ser\u00e3o mapeadas em tabelas no banco de dados, o hibernate ent\u00e3o far\u00e1 a comunica\u00e7\u00e3o entre nossa aplica\u00e7\u00e3o e o banco de dados. <\/p>\n<p>Iremos utilizar o hibernate para fazer o mapeamento de classes para tabelas em um banco de dados, ent\u00e3o antes de trabalharmos na aplica\u00e7\u00e3o \u00e9 necess\u00e1rio configurar algum SGBD para trabalhamos. Utilizaremos nesse tutorial o HSQLDB que \u00e9 um banco de dados em mem\u00f3ria escrito em Java e vai facilitar o nosso trabalho. <\/p>\n<h3>1. Baixando os pacotes necess\u00e1rios<\/h3>\n<p>Para esse tutorial precisaremos baixar v\u00e1rios arquivos:<\/p>\n<ul>\n<li>Hibernate Core (3.3.2 GA): cont\u00e9m o n\u00facleo do hibernate <\/li>\n<li>Hibernate Annotations (3.4.0 GA): cont\u00e9m a API necess\u00e1ria para configurar as classes com annotations <\/li>\n<li>SLF4J (1.5.x): sistema de log utilizado pelo hibernate <\/li>\n<li>HSQLDB (2.0 RC 8): banco de dados que utilizaremos no nosso exemplo <\/li>\n<\/ul>\n<p>Os arquivos podem ser baixados nas seguintes URLs<\/p>\n<p>Hibernate Core:    <br \/><a title=\"http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate3\/3.3.2.GA\/hibernate-distribution-3.3.2.GA-dist.zip\/download\" href=\"http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate3\/3.3.2.GA\/hibernate-distribution-3.3.2.GA-dist.zip\/download\">http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate3\/3.3.2.GA\/hibernate-distribution-3.3.2.GA-dist.zip\/download<\/a>     <\/p>\n<p>Hibernate Annotations:     <br \/><a title=\"http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate-annotations\/3.4.0.GA\/hibernate-annotations-3.4.0.GA.zip\/download\" href=\"http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate-annotations\/3.4.0.GA\/hibernate-annotations-3.4.0.GA.zip\/download\">http:\/\/sourceforge.net\/projects\/hibernate\/files\/hibernate-annotations\/3.4.0.GA\/hibernate-annotations-3.4.0.GA.zip\/download<\/a>     <\/p>\n<p>SLF4J:     <br \/><a title=\"http:\/\/www.slf4j.org\/dist\/slf4j-1.5.8.zip\" href=\"http:\/\/www.slf4j.org\/dist\/slf4j-1.5.8.zip\">http:\/\/www.slf4j.org\/dist\/slf4j-1.5.8.zip<\/a><\/p>\n<p>HSQLDB:    <br \/><a title=\"http:\/\/sourceforge.net\/projects\/hsqldb\/files\/alpha_beta\/hsqldb_2_0_0_rc8\/hsqldb-2.0.0-rc8.zip\/download\" href=\"http:\/\/sourceforge.net\/projects\/hsqldb\/files\/alpha_beta\/hsqldb_2_0_0_rc8\/hsqldb-2.0.0-rc8.zip\/download\">http:\/\/sourceforge.net\/projects\/hsqldb\/files\/alpha_beta\/hsqldb_2_0_0_rc8\/hsqldb-2.0.0-rc8.zip\/download<\/a><\/p>\n<p>Se desejar baixar vers\u00f5es diferentes ser\u00e1 necess\u00e1rio verificar a compatibilidade das vers\u00f5es das bibliotecas. No site do hibernate existe uma planilha com a compatibilidade de vers\u00f5es. A vers\u00e3o do HSQLDB n\u00e3o deve influenciar na compatibilidade. A vers\u00e3o do SLF4J deve ser a mesma do JAR contido no hibernate core.<\/p>\n<p>Baixe todos os arquivos e extraia o conte\u00fado para uma pasta qualquer.<\/p>\n<h3>2. Executando o HSQLDB<\/h3>\n<p>O HSQLDB, tamb\u00e9m conhecido como HyperSQL, \u00e9 um banco de dados bem simples e n\u00e3o necessita instala\u00e7\u00e3o. Utilizaremos ele apenas para ser poss\u00edvel experimentar o hibernate. Antes de executar a aplica\u00e7\u00e3o que iremos montar ser\u00e1 necess\u00e1rio ligar o banco de dados. Para ligar o banco de dados basta executar o arquivo <strong>runServer.bat <\/strong>que est\u00e1 dentro da pasta \/hsqldb\/bin. Nenhuma configura\u00e7\u00e3o \u00e9 necess\u00e1ria.<\/p>\n<p>Caso o banco de dados n\u00e3o esteja rodando quando executar a sua aplica\u00e7\u00e3o, um erro como o seguinte ser\u00e1 lan\u00e7ado:    <br \/><font size=\"2\" face=\"Courier New\">java.sql.SQLTransientConnectionException: java.net.ConnectException: Connection refused: connect<\/font><\/p>\n<h3>3. Criando um projeto e configurando as bibliotecas na aplica\u00e7\u00e3o<\/h3>\n<p>Crie um projeto no seu ambiente de desenvolvimento, \u00e9 importante que seja um projeto Java 1.5 ou superior pois utilizaremos annotations. Copie e adicione ao classpath as bibliotecas das seguintes pastas dos arquivos baixados anteriormente:<\/p>\n<p>\\hsqldb-2.0.0-rc8\\hsqldb\\lib<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; hsqldb.jar<\/p>\n<p>\\hibernate-distribution-3.3.2.GA<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; hibernate3.jar<\/p>\n<p>\\hibernate-distribution-3.3.2.GA\\lib\\required <font color=\"#5c5c5c\">(todas as bibliotecas)<\/font><\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; antlr-2.7.6.jar    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; commons-collections-3.1.jar     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; dom4j-1.6.1.jar     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; javassist-3.9.0.GA.jar     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; jta-1.1.jar     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; slf4j-api-1.5.8.jar<\/p>\n<p>\\hibernate-annotations-3.4.0.GA<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; hibernate-annotations.jar<\/p>\n<p>\\hibernate-annotations-3.4.0.GA\\lib<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; ejb3-persistence.jar    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; hibernate-commons-annotations.jar<\/p>\n<p>\\slf4j-1.5.8<\/p>\n<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; slf4j-simple-1.5.8.jar<\/p>\n<p>Totalizando 12 arquivos JAR.<\/p>\n<h3>4. Definindo a estrutura<\/h3>\n<p>Vamos criar apenas uma classe nessa aplica\u00e7\u00e3o, para ver como o hibernate funciona. Crie uma classe Produto conforme o exemplo:<\/p>\n<p><font size=\"2\" face=\"Courier New\">package org.javaframework.persistencia; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">import static javax.persistence.GenerationType.*; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">import javax.persistence.Entity;      <br \/>import javax.persistence.GeneratedValue;       <br \/>import javax.persistence.Id; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>@Entity<\/strong>       <br \/>public class Produto { <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160; @Id @GeneratedValue(strategy=SEQUENCE)<\/strong>       <br \/>&#160;&#160;&#160; Integer id;       <br \/>&#160;&#160;&#160; String nome;       <\/p>\n<p>&#160;&#160;&#160; public Produto(Integer id, String nome) {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.id = id;       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.nome = nome;       <br \/>&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160; public Produto(){       <br \/>&#160;&#160;&#160; }       <\/p>\n<p>&#160;&#160;&#160; public Integer getId() {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return id;       <br \/>&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160; public String getNome() {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return nome;       <br \/>&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160; public void setId(Integer id) {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.id = id;       <br \/>&#160;&#160;&#160; }       <br \/>&#160;&#160;&#160; public void setNome(String nome) {       <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.nome = nome;       <br \/>&#160;&#160;&#160; }       <br \/>}<\/font><\/p>\n<p>Essa classe produto possui dois atributos. O primeiro \u00e9 o <em>id<\/em>, o <em>id<\/em> ser\u00e1 utilizado apenas como a chave prim\u00e1ria do produto, n\u00e3o ter\u00e1 utilidade na nossa aplica\u00e7\u00e3o. Mas para o hibernate trabalhar, precisamos definir esse atributo na classe. Escolhemos a classe <em>Integer<\/em> para o atributo <em>id<\/em>, pois utilizaremos um sequencial num\u00e9rico para os registros do banco. O outro atributo \u00e9 o nome do produto. Repare que foi criado um construtor sem nenhum par\u00e2metro, esse construtor \u00e9 obrigat\u00f3rio (caso crie um outro construtor com v\u00e1rios argumentos, como no exemplo).<\/p>\n<p>A configura\u00e7\u00e3o dessa classe est\u00e1 nas anota\u00e7\u00f5es que utilizamos. A anota\u00e7\u00e3o @Entity define uma entidade, e deve ser utilizada em todas as classes que forem mapeadas pelo hibernate. A anota\u00e7\u00e3o @Id define o campo que ser\u00e1 o primary key no banco de dados. E a anota\u00e7\u00e3o @GeneratedValue indica que deve ser gerado um valor quando for salvar um novo produto a estrat\u00e9gia utilizada \u00e9 a SEQUENCE, que criar\u00e1 um novo sequencial para cada produto. Dependendo do banco de dados utilizado podem ser utilizadas outras estrat\u00e9gias, consulte a documenta\u00e7\u00e3o do hibernate para mais informa\u00e7\u00f5es.<\/p>\n<p><strong>Aten\u00e7\u00e3o<\/strong> para o pacote da anota\u00e7\u00e3o @Entity, deve ser utilizado o pacote javax.persistence. Existe outra anota\u00e7\u00e3o com o mesmo nome no pacote org.hibernate.annotations mas n\u00e3o servir\u00e1 para mapear a classe, apenas para adicionar informa\u00e7\u00f5es extras. Se utilizar a anota\u00e7\u00e3o do pacote errado o hibernate lan\u00e7ar\u00e1 exce\u00e7\u00f5es dizendo que a classe n\u00e3o foi mapeada.<\/p>\n<h3>5. Configurando o hibernate<\/h3>\n<p>Existem duas formas de configurar o hibernate, atrav\u00e9s de um XML ou de um arquivo de properties. Por sem mais simples, utilizaremos o arquivo de properties. Crie um arquivo chamado <strong>hibernate.properties<\/strong> na sua aplica\u00e7\u00e3o, ele deve ficar na raiz dos fontes (SRC no eclipse por exemplo) e deve estar na raiz do classpath quando executar sua aplica\u00e7\u00e3o (se estiver utilizando um editor, basta colocar o arquivo na pasta raiz dos fontes). O arquivo deve ficar assim:<\/p>\n<p><font size=\"2\" face=\"Courier New\">hibernate.connection.driver_class=org.hsqldb.jdbcDriver     <br \/>hibernate.connection.url=jdbc:hsqldb:hsql:\/\/localhost      <br \/>hibernate.connection.username=sa      <br \/>hibernate.connection.password= <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><font color=\"#008080\"># Echo all executed SQL to stdout<\/font>      <br \/>hibernate.show_sql=true <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\"><font color=\"#008080\"># Drop and re-create the database schema on startup<\/font>       <br \/>hibernate.hbm2ddl.auto=update<\/font><\/p>\n<p>Nesse arquivo temos nas quatro primeiras linhas as informa\u00e7\u00f5es de conex\u00e3o JDBC com o banco de dados. Configuramos tamb\u00e9m a exibi\u00e7\u00e3o de queries e que o hibernate deve criar a estrutura do banco de dados automaticamente.<\/p>\n<p>Com esse arquivo o Hibernate estar\u00e1 configurado. Caso voc\u00ea nao coloque o arquivo no lugar certo com o nome correto um erro como o seguinte pode acontecer: Exception in thread &quot;main&quot; org.hibernate.HibernateException: &#8216;hibernate.dialect&#8217; must be set when no Connection avalable.<\/p>\n<p>Vamos agora criar uma classe que utilizar\u00e1 o hibernate.<\/p>\n<h3>6. Executando um programa com o Hibernate<\/h3>\n<p>Crie na sua aplica\u00e7\u00e3o a seguinte classe para podermos testar o hibernate:<\/p>\n<p><font size=\"2\" face=\"Courier New\">package org.javaframework.persistencia; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">import java.util.List; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">import org.hibernate.SessionFactory;     <br \/>import org.hibernate.Transaction;      <br \/>import org.hibernate.cfg.AnnotationConfiguration;      <br \/>import org.hibernate.classic.Session; <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">public class HelloWorldHibernate { <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; public static void main(String[] args) {     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>AnnotationConfiguration<\/strong> config = new AnnotationConfiguration();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; config.addAnnotatedClass(Produto.class);      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>SessionFactory<\/strong> sessionFactory = config.buildSessionFactory();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>Session<\/strong> session = sessionFactory.openSession();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; inserirProduto(session);      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; listarProdutos(session);      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; session.close();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; sessionFactory.close();      <br \/>&#160;&#160;&#160; } <\/font><\/p>\n<p><font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; private static void inserirProduto(Session session) {     <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Produto produto = new Produto();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; produto.setNome(&quot;Shampoo&quot;);      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Transaction tx = session.beginTransaction();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; session.persist(produto);      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; tx.commit();      <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Produto inserido&quot;);      <br \/>&#160;&#160;&#160; }<\/font><\/p>\n<p> <font size=\"2\" face=\"Courier New\">&#160;&#160;&#160; private static void listarProdutos(Session session) {   <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&lt;Produto&gt; produtos = session.createQuery(&quot;from Produto&quot;).list();    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (Produto p: produtos) {    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.printf(&quot;%4d \\t %s %n&quot;, p.getId(), p.getNome());    <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br \/>&#160;&#160;&#160; } <\/font>  <\/p>\n<p><font size=\"2\" face=\"Courier New\">}<\/font><\/p>\n<p>A classe HelloWorldHibernate \u00e9 apenas para efeito did\u00e1dico, \u00e9 interessante voc\u00ea estruturar a sua aplica\u00e7\u00e3o de maneira mais elegante. <\/p>\n<p>Nesse c\u00f3digo criamos um AnnotationConfiguration que permite a configura\u00e7\u00e3o de classes anotadas no Hibernate. Adicionamos a classe Produto para ser adicionada a configura\u00e7\u00e3o. O arquivo hibernate.properties ser\u00e1 lido automaticamente. Com essa configura\u00e7\u00e3o construimos um SessionFactory. Um SessionFactory serve para criamos sess\u00f5es do hibernate. Devemos ter apenas um SessionFactory na aplica\u00e7\u00e3o mas podemos ter v\u00e1rios Sessions (geralmente um para cada thread, ou um por requisi\u00e7\u00e3o no caso de aplica\u00e7\u00f5es web). Um SessionFactory \u00e9 como um DataSource e um Session \u00e9 como um Connection. <\/p>\n<p>Temos dois m\u00e9todos bastante simples, um \u00e9 o inserirProduto, que salva um novo produto no banco de dados, inclusive utilizando uma transa\u00e7\u00e3o. E um m\u00e9todo listarProdutos que lista todos os produtos encontrados no banco de dados.<\/p>\n<p>Se executarmos o programa veremos algo semelhante ao seguinte:<\/p>\n<p><font color=\"#4a4a4a\">Hibernate: call next value for hibernate_sequence     <br \/>Hibernate: insert into Produto (nome, id) values (?, ?)      <br \/>Produto salvo      <br \/>Hibernate: select produto0_.id as id0_, produto0_.nome as nome0_ from Produto produto0_      <br \/>&#160; 10&#160;&#160;&#160;&#160;&#160; Shampoo<\/font> <\/p>\n<p>Pronto! J\u00e1 pode agora utilizar o hibernate nos seus projetos. Veja a documenta\u00e7\u00e3o de referencia no site <a href=\"http:\/\/www.hibernate.org\">http:\/\/www.hibernate.org<\/a> para mais exemplos de consultas, opera\u00e7\u00f5es e mapeamentos. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>O Hibernate \u00e9 um dos mais famosos frameworks de persistencia. Um framework de persistencia \u00e9 uma ferramenta que ajudar\u00e1 a persistir, ou seja, salvar, os seus dados em algum local, um banco de dados por exemplo. O Hibernate faz o mapeamento das classes de sua aplica\u00e7\u00e3o em tabelas e colunas do banco de dados. Com [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-23","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":0,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaframework.org\/portal\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}