<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; hibernate</title>
	<atom:link href="http://blog.caelum.com.br/tag/hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>As novidades do Hibernate 4</title>
		<link>http://blog.caelum.com.br/as-novidades-do-hibernate-4/</link>
		<comments>http://blog.caelum.com.br/as-novidades-do-hibernate-4/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 13:23:37 +0000</pubDate>
		<dc:creator>Hanneli Tavante</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4799</guid>
		<description><![CDATA[Um dos mais badalados frameworks de ORM no mundo Java (e popular também no .NET), o Hibernate recentemente ganhou sua versão 4.0 Final, que chega para arrebentar de novidades. O framework surgiu em 2001, por iniciativa de Gavin King, e logo se tornou amplamente utilizado devido a uma grande diversidade de recursos para mapeamento objeto <a href="http://blog.caelum.com.br/as-novidades-do-hibernate-4/#more-4799'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/01/hibernate-logo.png" width="240" />
		</p><p>Um dos mais badalados frameworks de ORM no mundo Java (e popular também no .NET), o Hibernate recentemente ganhou sua versão 4.0 Final, que chega para <a href="http://in.relation.to/Bloggers/WhatsNewInHibernateCore40">arrebentar de novidades</a>. O framework surgiu em 2001, por iniciativa de Gavin King, e logo se tornou amplamente utilizado devido a uma grande diversidade de recursos para mapeamento objeto relacional. Com a especificação da JPA (Java Persistence API), solidificou-se como  a implementação mais utilizada. Diversos projetos também passaram a ser desenvolvidos pela equipe do Hibernate a fim de aprimorar os recursos existentes no framework. Muitos deles, em vez de serem anexados ao projeto Core, tornaram-se plugins, tais como <a href="http://hibernate.org/subprojects/search.html">Hibernate Search</a>, o <a href="http://hibernate.org/subprojects/ogm.html">Hibernate OGM</a> e o <a href="http://hibernate.org/subprojects/validator.html">Hibernate Validator</a>. Este último, inclusive, teve fortes influências para a criação de uma nova especificação, a Bean Validation (JSR 303).</p>
<p>A partir da <a href="http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/">versão 3.5</a>, o Hibernate tornou-se uma implementação certificada para a JPA2 (<a href="http://jcp.org/en/jsr/detail?id=317">JSR 317</a>), lançada oficialmente no final de 2009. Várias annotations surgiram e muitos recursos foram aprimorados. Em dezembro de 2011, a versão 4.0 Final veio à tona, trazendo algumas importantes novidades que gostaríamos de destacar:</p>
<h2>Redesign da SessionFactory</h2>
<p>Possivelmente essa é uma das grandes mudanças no Hibernate 4. Estávamos habituados a obter uma <code>SessionFactory</code> da seguinte forma:</p>
<pre class="brush: java; title: ; notranslate">
private static final SessionFactory sessionFactory =
    new Configuration().configure().buildSessionFactory();
</pre>
<p>Entretanto, agora o método <code>buildSessionFactory()</code> está listado como deprecated, bem como as classes de <code>Configuration</code>: <code>org.hibernate.cfg.Configuration</code> e <code>AnnotationConfiguration</code>. A nova forma de se obter uma <code>SessionFactory</code> é através do <code>ServiceRegistry</code>, que explicaremos adiante, lançado para esta versão 4:</p>
<pre class="brush: java; title: ; notranslate">
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
    .configure().buildServiceRegistry();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addResource(&quot;algum.hbm.xml&quot;)
    .addAnnotatedClass(SuaEntidade.class);
Metadata metadata = metadataSources.buildMetadata();
SessionFactory sessionFactory = metadata.buildSessionFactory();
</pre>
<p>Para que possamos obter uma <code>SessionFactory</code>, precisamos de um <code>ServiceRegistry</code>, seguido de um <code>MetadataSources</code> (eventualmente podemos adicionar recursos, classes anotadas, entre outros, de forma similar ao <code>Configuration</code>); a partir deste obtemos um <code>Metadata</code> e então finalmente conseguimos uma <code>SessionFactory</code>. </p>
<p>Para obter uma <code>EntityManagerFactory</code> nada muda, podemos usufruir da classe <code>javax.persistence.Persistence</code>.</p>
<h2>ServiceRegistry</h2>
<p>Uma nova forma foi implementada para que o Hibernate gerencie seus serviços. Services são classes que fornecem ao Hibernate diversos tipos de funcionalidades, tais como <code>ClassLoader</code>, conexão com o banco (<code>ConnectionProvider</code>), descoberta de dialetos apropriados, entre outros. Você deve estar se perguntando por que isso é um ponto interessante. O fato chave é que agora todos os serviços possuem uma interface. Caso queira, você pode mudar a forma com que o Hibernate realiza algumas funcionalidades de uma maneira muito simples, apenas fazendo com que suas classes implementem a interface de serviço do Hibernate. É uma forma de desacoplar seu código interno e se tornar mais maleável.</p>
<h2>Suporte a Multi-Tenancy</h2>
<p>Para que não conhece o termo, aí vai um pequeno resumo &#8211; em um modelo multi-tenant, é possível compartilhar os mesmos recursos físicos para clientes/empresas diferentes, mas ao mesmo tempo permite-se que fiquem logicamente isolados. A frase anterior pode parecer abstrata, então imagine diversas aplicações de e-commerce. Muitas delas possuem um core muito similar e diferem apenas em questões de layout e UI. Imagine então que fosse criada uma base de código igual para todas essas lógicas de e-commerce e apenas o design de cada loja diferente fosse mudado; cada uma delas teria seu próprio <code>namespace</code> e um endereço na web; contudo a base de código seria a mesma. Esses websites de lojas de e-commerce seriam cada um, um tenant.</p>
<p>Podemos implementar o Multi-Tenancy de algumas formas: Instâncias de bancos separadas (cada tenant possui sua prórpia instância de banco); Schema separados (os tenants compartilham o mesmo banco físico, entretanto cada um deles possui um schema); e também podemos implementar o Multi-Tenancy através de Particionamento (usamos o mesmo banco físico e o mesmo Schema), onde os tenants são particionados de acordo com algum discriminator value (uma chave que apareceria em toda as tabelas) e uma única tabela guarda os dados de cada um deles. O Hibernate 4 dá suporte a esta última opção de maneira fácil. Para este caso, tomemos como exemplo uma tabela no banco denominada Cliente:</p>
<pre class="brush: plain; title: ; notranslate">
CLIENTE (
  ID BIGINT,
  NOME VARCHAR,
  ...
  TENANT_ID VARCHAR (ou uma chave estrangeira)
)
</pre>
<p>Note que precisamos do campo <code>TENANT_ID</code>, pois ele define a qual tenant nos referimos. Em um exemplo real, esse ID vai dizer a qual loja pertence determinado produto, por exemplo. Essa abordagem via Particionamento ainda dá suporte a cache de segundo nível.</p>
<p>Mas será que sempre precisaremos nos lembrar de criar um TENANT_ID em nossas tabelas? Como poderíamos ter algo como:</p>
<pre class="brush: plain; title: ; notranslate">
CLIENTE (
  ID BIGINT,
  NOME VARCHAR,
  ...
)
</pre>
<p>sem termos um <code>TENANT_ID</code>? Poderíamos ter schemas separados e criarmos uma <code>SessionFactory</code> para cada tenant. Entretanto, isso seria inviável se tivéssemos muitos tenants, pois muitas <code>SessionFactories</code> podem ser extremamente custosas para a memória. Uma outra ideia seria utilizarmos uma abordagem conhecida como <a href="http://relation.to/Bloggers/MultitenancyInHibernate">application-supplied connections</a>, onde abrimos uma Session em cada SessionFactory através de uma Connection específica que fornecemos. Podemos dizer ao Hibernate qual Connection utilizar em cada contexto. Lembra-se de quando explicamos o ServiceRegistry? Um dos Services, é o ConnectionProvider.  Separando os schemas evitamos a necessidade de um <code>TENANT_ID</code> em cada tabela, mas perdemos a possibilidade de usar o cache de segundo nível de maneira fácil, além de ser mais trabalhoso realizar relatórios e estatísticas com mais de um cliente.</p>
<p>O Hibernate 4 fornece essas alternativas básicas para o cenário multi-tenant, de forma quase transparente.</p>
<h2>Usando o Hibernate 4</h2>
<p>Quer ver o Hibernate 4 em ação? A maneira mais fácil de colocá-lo em seu projeto é através do Maven:</p>
<pre class="brush: xml; title: ; notranslate">
  &lt;dependency&gt;
    &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
    &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
    &lt;version&gt;4.0.1.Final&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
    &lt;artifactId&gt;hibernate-entitymanager&lt;/artifactId&gt;
    &lt;version&gt;4.0.1.Final&lt;/version&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
    &lt;artifactId&gt;hibernate-annotations&lt;/artifactId&gt;
    &lt;version&gt;3.5.6-Final&lt;/version&gt;
  &lt;/dependency&gt;
</pre>
<p>Se você utiliza alguma outra ferramenta de build, <a href="http://mvnrepository.com/artifact/org.hibernate">aqui você encontra todas as dependências necessárias </a> declaradas para Ivy, Gradle, SBT, entre outros.</p>
<p>Você também pode baixar os jars necessários <a href="http://sourceforge.net/projects/hibernate/files/hibernate4/4.0.0.Final/hibernate-release-4.0.0.Final.zip/download" target="_blank">para usá-los diretamente</a>. Caso você use o JBoss AS 7 (<a href="http://blog.caelum.com.br/jboss-as-7-inovacao-nos-servidores-java-ee/">conheça mais sobre essa nova versão do servidor</a>), a versão 7.1 (ainda em Beta) já vem com o Hibernate 4 Final. Se você preferir o cloud, pode experimentar o Hibernate 4 no Openshift (<a href="http://blog.caelum.com.br/screencast-sua-app-no-cloud-com-openshift/">aqui há um tutorial no blog da Caelum</a>).</p>
<p>Gostou? Há muito mais nos links abaixo:</p>
<p>Webinar de Hibernate 4 &#8211; <a href="http://www.youtube.com/watch?v=sBBVwOC9o_Y">link</a><br />
Hibernate 4 &#8211; post oficial do <a href="http://relation.to/Bloggers/HibernateCore40IsFinal">in.relation.to</a><br />
Multi-Tenancy &#8211; mais informações (<a href="http://www.developer.com/design/article.php/3801931/Introduction-to-Multi-Tenant-Architecture.htm">tutorial introdutório</a>)<br />
Multi-Tenancy e Hibernate 4 &#8211; <a href="https://community.jboss.org/wiki/Multi-tenancyDesign">Perguntas e Respostas</a></p>
<p>Também não deixe de visitar <a href="http://blog.caelum.com.br/tag/hibernate/">os vários posts da Caelum</a> sobre Hibernate, inclusive o conhecido<a href="http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/"> 7 hábitos dos desenvolvedores Hibernate e JPA altamente eficazes</a>. Esperamos você no <a href="http://www.caelum.com.br/curso/fj-25-persistencia-jpa2-hibernate/">nosso curso de Hibernate e JPA</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/as-novidades-do-hibernate-4/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Adequar o banco às entidades ou o contrário?</title>
		<link>http://blog.caelum.com.br/adequar-o-banco-as-entidades-ou-o-contrario/</link>
		<comments>http://blog.caelum.com.br/adequar-o-banco-as-entidades-ou-o-contrario/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 13:37:37 +0000</pubDate>
		<dc:creator>Erich Egert</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[embeddable]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[mapeamento]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4515</guid>
		<description><![CDATA[Uma das features interessantes do Hibernate é gerar a Data Definition Language para criação da estrutura de tabelas do banco de dados (schema). Tudo que precisamos fazer é pensar em nosso modelo Orientado a Objeto que o banco é gerado automaticamente a partir das entidades. Aparentemente o processo de pensar na modelagem do banco de <a href="http://blog.caelum.com.br/adequar-o-banco-as-entidades-ou-o-contrario/#more-4515'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/08/database-application.jpg" width="240" />
		</p><p>Uma das features interessantes do <a title="Hibernate" href="http://www.hibernate.org/">Hibernate</a> é gerar a <a title="Data Definition Language" href="http://en.wikipedia.org/wiki/Data_Definition_Language">Data Definition Language</a> para criação da estrutura de tabelas do banco de dados (schema). Tudo que precisamos fazer é pensar em nosso modelo Orientado a Objeto que o banco é gerado automaticamente a partir das entidades. Aparentemente o processo de pensar na modelagem do banco de dados tornou-se obsoleto: é aí que mora o perigo.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/08/database-application.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/08/database-application.jpg" alt="mapeamento de banco de dados a orientacao a objetos" title="database-application" width="400" height="300" class="aligncenter size-full wp-image-4518" /></a></p>
<p>Na orientação a objetos é preferível favorecer especialização através da divisão de responsabilidades. Em vez de criar uma classe gigantesca devemos quebrá-la em pequenas classes.</p>
<p>Quando o assunto é banco de dados a análise é bem diferente. No modelo relacional, a preocupação é normalização dos dados e a modelagem ao mesmo tempo tende a ser pensada de forma a evitar a necessidade de alguns joins que seriam mais caros. Muitas vezes é preferível criar uma tabela com várias colunas com todas as informações pertinentes a criar várias tabelas especializadas. Para ilustrar, considere as entidades:</p>
<pre class="brush: java; title: ; notranslate">
@Entity
public class Produto {
  @Id
  @GeneratedValue
  private Long id;
  private String nome;
  private BigDecimal preco;
  private Calendar inicioPeriodoPromocional;
  private Calendar fimPeriodoPromocional;
  // outros atributos e metodos
}

@Entity
public class Promocao {
 private Calendar inicio;
 private Calendar fim;
 //outros atributos e metodos
}
</pre>
<p>Suponha que gostaríamos de saber se uma promoção é aplicável a um produto e por quantos dias podemos aproveitar uma promoção. Colocar esse código dentro de um controller ou managed bean não parece uma boa idéia. Esse trecho rapidamente reaparecerá em outro lugar. Onde então podemos criar métodos para essa análise? Poderíamos começar criando a classe <code>Intervalo</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class Intervalo {
  private Calendar inicio;
  private Calendar fim;
}
</pre>
<p>E em vez de <code>Produto</code> e <code>Promocao</code> guardarem referências para duas datas, guardariam para um <code>Intervalo</code>, removendo os respectivos <code>Calendars</code>:</p>
<pre class="brush: java; title: ; notranslate">
@Entity
public class Produto {
  @Id
  @GeneratedValue
  private Long id;
  private String nome;
  private BigDecimal preco;
  private Intervalo periodoPromocional;
  //...
}

@Entity
public class Promocao {
  private Intervalo vigencia;
  //...
}
</pre>
<p>A criação da classe <code>Intervalo</code> pode trazer benefícios muito maiores do que a eliminação da repetição de atributos. Adotando a boa prática de unir dados a comportamentos, podemos isolar todo comportamento relacionado a um intervalo de datas nessa nova classe:</p>
<pre class="brush: java; title: ; notranslate">
public class Intervalo {
  private Calendar inicio;
  private Calendar fim;

  public int getDias() {...}
  public Intervalo interseccaoCom(Intervalo outro) {...}
}
</pre>
<p>Para saber quantos dias temos para aproveitar a promoção faríamos:</p>
<pre class="brush: java; title: ; notranslate">
Intervalo janelaDeOportunidade =
  produto.getPeriodoPromocional().interseccaoCom(promocao.getVigencia());

int diasParaAproveitar = janelaDeOportunidade.getDias();
</pre>
<p>Mas como mapeamos a classe <code>Intervalo</code>? Criar uma tabela e referenciar seus registros através de chaves estrangeiras nas tabelas <code>Produto</code> e <code>Promocao</code> só trará a necessidade de joins. A JPA nos oferece uma alternativa: criar uma classe <code>Embeddable</code>, um dos assuntos básicos abordados no <a title="FJ-25 Persistência com JPA2 e Hibernate" href="http://www.caelum.com.br/curso/fj-25-persistencia-jpa2-hibernate/">FJ-25</a>. Quando anotamos uma classe com <code>@Embeddable</code>, seus atributos serão colunas na tabela da entidade que tem o atributo anotado com <code>@Embedded</code>.</p>
<pre class="brush: java; title: ; notranslate">
@Embeddable
public class Intervalo {
  //...
}

@Entity
public class Promocao {
  @Embedded
  private Intervalo vigencia;
  // a tabela Promocao terá uma coluna inicio e outra fim
  // ...
}
</pre>
<p>A classe <code>Intervalo</code> não precisa de um identificador único: ela é definida pelo seu valor e pode ser encarada como um <a title="Value Object" href="http://martinfowler.com/bliki/ValueObject.html">Value Object</a>. É importante conhecer os diversos recursos do Hibernate que nos dão a possibilidade de não precisar adequar nossas entidades às nossas tabelas, nem de adequar nossas tabelas às nossas entidades. Por exemplo, tabelas secundárias oferecem o serviço inverso: uma entidade mapeada em duas tabelas. O próprio <code>@ManyToMany</code> evita a criação de uma classe a mais apenas para manter referências para as duas classes relacionadas. Há ainda o suporte a chaves compostas, herança, nomenclatura das tabelas, namespaces e colunas, e até mesmo tipos definidos pelo próprio usuário para cada banco de dados diferente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/adequar-o-banco-as-entidades-ou-o-contrario/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Caçando seus gargalos com o Hibernate Statistics</title>
		<link>http://blog.caelum.com.br/cacando-seus-gargalos-com-o-hibernate-statistics/</link>
		<comments>http://blog.caelum.com.br/cacando-seus-gargalos-com-o-hibernate-statistics/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 13:55:20 +0000</pubDate>
		<dc:creator>Guilherme de Almeida Moreira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[estatisticas]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4208</guid>
		<description><![CDATA[Uma reclamação frequente dos novos usuários do Hibernate é o excesso de queries realizadas pelo framework, afetando não só a performance mas também a escalabilidade da aplicação. Será realmente culpa do framework? Práticas simples podem ajudar a enfrentar esses gargalos ao usar o Hibernate, mas como detectá-los numa aplicação que já foi mapeada sem muito <a href="http://blog.caelum.com.br/cacando-seus-gargalos-com-o-hibernate-statistics/#more-4208'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/06/graficos_geral.png" width="240" />
		</p><p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/06/graficos_geral.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/06/graficos_geral-300x145.png" alt="" title="graficos_geral" width="300" height="145" class="alignleft size-medium wp-image-4472" /></a> Uma reclamação frequente dos novos usuários do Hibernate é o excesso de queries realizadas pelo framework, afetando não só a performance mas também a escalabilidade da aplicação. Será realmente culpa do framework? Práticas simples podem ajudar a <a href="http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/">enfrentar esses gargalos ao usar o Hibernate</a>, mas como detectá-los numa aplicação que já foi mapeada sem muito cuidado? Uma das ferramentas mais úteis para o desenvolvedor na hora de otimizar e corrigir problemas com o Hibernate, além dos logs, são as estatísticas. Através do <i>Hibernate Statistics</i> poderemos dizer quantas vezes cada entidade, coleção (relacionamento) e query está sendo carregada/executada, quantas vezes o cache foi usado, tempo médio de cada query, etc. Em mão desses dados, temos mais pistas de onde colocar cache, configurar batchsize e fazer joins com fetch eager. </p>
<p>Para habilitar o uso das estatísticas do Hibernate temos duas formas. A primeira através do arquivo de configuração do hibernate e a segunda programaticamente. Ao escolher a maneira programática temos a vantagem de poder habilitar e desabilitar a coleta de estatísticas a qualquer momento. Mas não se preocupe, pois podemos usar as duas ao mesmo tempo!</p>
<p>Para habilitar através do arquivo de configuração basta adicionar a seguinte propriedade no hibernate.cfg.xml:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;property name=&quot;hibernate.generate_statistics&quot;&gt;true&lt;/property&gt;
</pre>
<p>Programaticamente usamos o <code>SessionFactory</code>:</p>
<pre class="brush: java; title: ; notranslate">
sessionFactory.getStatistics().setStatisticsEnabled(true);
</pre>
<p>Passada etapa de configuração vamos ver um exemplo de ajuda que o hibernate statistics pode dar. Para o exemplo abaixo temos uma classe utilitária para facilitar a criação de <code>Session</code>s e das <code>Statistics</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class HibernateUtil {

	private static SessionFactory factory;

	static {
		factory = new Configuration().configure().buildSessionFactory();
	}

	public static Session openSession() {
		return factory.openSession();
	}

	public static Statistics getStatistics() {
		if (!factory.getStatistics().isStatisticsEnabled()) {
			factory.getStatistics().setStatisticsEnabled(true);
		}
		return factory.getStatistics();
	}
}
</pre>
<p>O indicado nesses casos seria usar algum container de Injeção de Dependências para fazer este controle, mas esse é um outro assunto.</p>
<p>O caso abaixo é o exemplo <code>Pessoa</code> que possui uma lista de <code>Telefone</code>. Nesse código estamos simulando a criação de 10 pessoas e seus respectivos telefones. Porém se notarmos bem o código, estamos salvando primeiro o telefone e depois a pessoa. Essa ordem acabará gerando (dependendo do dialeto hibernate utilizado no banco) um <code>update</code> para cada par de Pessoa e Telefone que inserirmos, pois o hibernate ao salvar o telefone ainda não tem o id da pessoa para enviar no <code>insert</code> de telefone.</p>
<p>Com o Hibernate Statistics podemos conferir quantos updates foram disparados através do método <code>getEntityUpdateCount</code> e conferir se realmente estamos disparando as operações da maneira correta:</p>
<pre class="brush: java; title: ; notranslate">
public class TesteQuantidadeUpdatesOrdemErrada {
	public static void main(String[] args) {
		Session session = HibernateUtil.openSession();
		Statistics statistics = HibernateUtil.getStatistics();
		long antes = statistics.getEntityUpdateCount();

		for (int i = 0; i &lt; 10; i++) {
			Transaction transaction = session.beginTransaction();

			Pessoa p = new Pessoa();
			p.setNome(&quot;Caelum &quot;+1);
			Telefone t1 = new Telefone();
			t1.setValor(&quot;5571-2751&quot;);
			t1.setTipo(&quot;comercial&quot;);
			t1.setPessoa(p);

			session.save(t1);
			session.save(p);
			transaction.commit();
		}
		long depois = statistics.getEntityUpdateCount();
		System.out.println(depois-antes);
	}
}
</pre>
<p>Ao rodar o código temos a saída <b>&#8220;Updates disparados:10&#8243;</b>. Graças ao Hibernate Statistics foi fácil de ver esses updates a mais, sem ter de ficar verificando os enormes logs de queries que uma aplicação pode gerar. Para resolver essa pendência basta inverter a ordem dos <code>saves</code> que teremos <b>0</b> <i>updates</i> no hibernate statistics.</p>
<p>O código abaixo insere dez pessoas no banco:</p>
<pre class="brush: java; title: ; notranslate">
public static void main(String[] args) {
		Statistics statistics = HibernateUtil.getStatistics();

		long abertas = statistics.getSessionOpenCount();
		long fechadas = statistics.getSessionCloseCount();
		System.out.println(&quot;Sessoes nao fechadas:&quot;+(abertas-fechadas));

		for (int i = 0; i &lt; 10; i++) {
			Session session = HibernateUtil.openSession();
			Transaction transaction = session.beginTransaction();
			try{
				Pessoa p = new Pessoa();
				p.setNome(&quot;Caelum &quot;+1);
				session.save(p);
				transaction.commit();
				session.close();
			}catch (Exception e) {
				System.err.println(e);
				transaction.rollback();
			}
		}
		abertas = statistics.getSessionOpenCount();
		fechadas = statistics.getSessionCloseCount();
		System.out.println(&quot;Sessoes nao fechadas:&quot;+(abertas-fechadas));
	}
}
</pre>
<p>Em uma execução normal teríamos todas as sessões fechadas sem problema algum, porém vamos simular um erro a cada 3 <code>save</code>s:</p>
<pre class="brush: java; title: ; notranslate">
Pessoa p = new Pessoa();
p.setNome(&quot;Caelum &quot; + 1);
if (i%3 == 0) {
	throw new RuntimeException();
}
session.save(p);
transaction.commit();
session.close();
</pre>
<p>Agora vemos através do hibernate statistics que nosso <code>try/catch</code> está falho e que, caso algo saia errado, esquecemos de fechar a sessão no <code>catch</code>. O certo neste caso era fechar a sessão no bloco <code>finally</code>, evitando que por causa de esquecimento alguém não tenha fechado a sessão.</p>
<pre class="brush: java; title: ; notranslate">
}catch (Exception e) {
	System.err.println(e);
	transaction.rollback();
}finally{
	session.close();
}
</pre>
<p>Agora o hibernate statistics mostrará que todas as sessões foram fechadas para esse caso. Vale lembrar que  ainda devemos verificar se o <code>close</code> terminou com sucesso, eliminando as possibilidades de uma sessão ou transação permanecer aberta (em último caso, deve ser logado com prioridade).</p>
<p>Podemos até coletar informações sobre as transações, adicionando as linhas de código abaixo, mostrando a quantidade de transações totais e as que deram certo:</p>
<pre class="brush: java; title: ; notranslate">
System.out.println(&quot;Quantidade total de Transacoes:&quot; +
    statistics.getTransactionCount());
System.out.println(&quot;Quantidade de Transacoes ok:&quot; +
    statistics.getSuccessfulTransactionCount());
</pre>
<p>É de grande ajuda que os sistemas tenham uma página que possa mostrar algumas dessas informaçãoes a qualquer hora. Inclusive o hibernate tem um método que mostra no log um resumo de todas as estatísticas importantes, para ver esse imprimi-lo basta invocar <code>logSummary</code> da classe <code>Statistics</code>.</p>
<p>O Hibernate Statistics está cheio de métodos uteis, uma pequena lista dos principais:</p>
<ul>
<li>
	<b><code>getEntity[Delete,Insert,Load,Update]Count():long</code></b><br />
	<i>serve para obter informações sobre os CRUD das entidades</i>
	</li>
<li>
	<b><code>getQueryExecutionMaxTimeQueryString():String</code></b><br />
	<i>retorna a consulta mais demorada</i>
	</li>
<li>
	<b><code>getQueryExecutionMaxTime():long</code></b><br />
	<i>retorna o tempo de execução da consulta mais demorada</i>
	</li>
<li>
	<b><code>getSecondLevelCacheHitCount():long</code></b><br />
	<i>retorna quantas vezes o hibernate conseguiu a informação que queria<br />
	através do cache</i>
	</li>
<li>
	<b><code>getSecondLevelCacheMissCount():long</code></b><br />
	<i>retorna quantas vezes o hibernate teve que ir no banco buscar a<br />
	informação que queria pois ela não estava no cache</i>
	</li>
</ul>
<p>Existem muitos outros métodos interessantes que podem ser conferidos no <a href="http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/stat/Statistics.html">javadoc da classe <code>Statistics</code></a>. Suas informações vai te ajudar a decidir que queries devem ser reescritas, colocadas no second level cache, quais relacionamentos devem ser carregados em modo batch, etc. </p>
<p>Apenas as estatísticas do Hibernate não vão ajudar a resolver todos os problemas da aplicação, porém facilitará muito quando você tiver que achar pequenas falhas, inconsistências, lentidão e excessos na comunicação aplicação-banco. <a href="http://blog.caelum.com.br/logar-e-preciso-debugar-nao-e-preciso/">Monitorar muito bem sua aplicação é essencial</a>, para não depender apenas de utilizar profilings e debuggers, que deveriam ser ferramentas apenas nos casos mais graves.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/cacando-seus-gargalos-com-o-hibernate-statistics/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Possibilidades de design no uso do seu Generic DAO</title>
		<link>http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/</link>
		<comments>http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 02:57:38 +0000</pubDate>
		<dc:creator>Lucas Cavalcanti</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[di]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[oo]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2948</guid>
		<description><![CDATA[Muitas vezes, quando estamos criando nosso sistema temos a tentação de criar o GenericDAO para não ter que ficar repetindo as operações CRUD e listagens. O maior problema com o GenericDAO é que não necessariamente todas as operações fazem sentido para uma determinada classe. Daí o que fazer se, por exemplo, não faz sentido excluir <a href="http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/#more-2948'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes, quando estamos criando nosso sistema temos a tentação de criar o <a href="http://blog.caelum.com.br/brincando-com-generics-o-bizarregenericdao/">GenericDAO</a> para não ter que ficar repetindo as operações <em>CRUD</em> e listagens.</p>
<p>O maior problema com o <code>GenericDAO</code> é que não necessariamente todas as operações fazem sentido para uma determinada classe. Daí o que fazer se, por exemplo, não faz sentido excluir um pagamento?</p>
<pre class="brush: java; title: ; notranslate">
public class PagamentoDAO
          extends GenericDAO&lt;Pagamento&gt; {

     @Override
     public void excluir(Pagamento pagamento) {
         throw new UnsupportedOperationException();
     }
}
</pre>
<p>Não parece uma solução muito elegante, mas é um dos únicos jeitos de proibir uma operação declarada na classe mãe, e ainda assim, só funciona em tempo de execução. Esse é um dos principais motivos para muitos não gostarem de usar o <code>GenericDAO</code> e <a href="http://blog.caelum.com.br/como-nao-aprender-orientacao-a-objetos-heranca/">preferirem usar composição ao invés de herança</a>. Mas como fazer para não repetir o código <b>trivial</b> das operações do <em>CRUD</em>?</p>
<p>Um dos jeitos é usar uma outra abstração de persistência de objetos: o <a href="http://martinfowler.com/eaaCatalog/repository.html">Repository</a>. Com o <em>Repository</em>, temos um lugar onde podemos guardar e buscar por objetos, não importando como fazemos isso. O <em>DAO</em> já está muito ligado com armazenamento em banco de dados, e foi criado quando as operações do BD eram muito trabalhosas (em especial no <em>JDBC</em>).</p>
<p>E como juntar o <em>Repository</em> com o <code>GenericDAO</code>? O <em>Repository</em> pode ser definido, por exemplo, como uma interface, e aí podemos fazer o seguinte: se, para um pagamento, faz sentido apenas salvar e listar, mas não excluir, então criamos a interface:</p>
<pre class="brush: java; title: ; notranslate">
public interface PagamentoRepository {
    void salva(Pagamento pagamento);
    Pagamento busca(Long id);
    List&lt;Pagamento&gt; lista();
}
</pre>
<p>E usamos o <code>GenericDAO</code> como <b>implementação</b> dessa interface:</p>
<pre class="brush: java; title: ; notranslate">
class PagamentoDAO
          extends GenericDAO&lt;Pagamento&gt;
          implements PagamentoRepository {
   // implementacao extra
}
</pre>
<p>E no nosso código de domínio &#8220;<strong>nunca</strong>&#8221; referenciaremos o <code>PagamentoDAO</code>, apenas o <code>PagamentoRepository</code>, assim mesmo que a <a href="http://www.arquiteturajava.com.br/livro/programe-voltado-a-interface-nao-a-implementacao.pdf">implementação saiba fazer mais coisas</a>, a interface só expõe as operações suportadas.</p>
<p>Se você usa <a href="http://www.arquiteturajava.com.br/livro/inversao-de-controle-cade-minha-chave-de-fenda.pdf">Injeção de Dependências</a> e algum framework que a suporta (como o <a href="http://vraptor.caelum.com.br">VRaptor</a>, Spring ou Java EE6), você pode deixar os <em>DAO</em>s apenas como infraestrutura, e usar os <em>Repositories</em> como interfaces públicas da sua aplicação:</p>
<pre class="brush: java; title: ; notranslate">
public class PagamentoController {
    public PagamentoController(PagamentoRepository repository) {
         this.repository = repository;
    }

    public void salva(Pagamento pagamento) {
         // validações e outras regras
         repository.salva(pagamento);
    }
}
</pre>
<p>Ainda poderíamos melhorar o nome do nosso repositório para <code>BaseDePagamentos</code>, <code>ContasAPagar</code> ou ainda <code>Pagamentos</code>, evitando usar sufixos nas classes. Usando abstrações e padrões simples conseguimos evitar repetição de código sem perder a semântica e restrições das nossas classes de modelo, além de esconder detalhes de implementação.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/possibilidades-de-design-no-uso-do-seu-generic-dao/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Iniciativa Caelum Open Source</title>
		<link>http://blog.caelum.com.br/iniciativa-caelum-open-source/</link>
		<comments>http://blog.caelum.com.br/iniciativa-caelum-open-source/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 12:00:32 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[guj]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[restfulie]]></category>
		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2459</guid>
		<description><![CDATA[A Caelum sempre reconheceu o poder da comunidade e do open source, e ativamente participa de ambas. Disponibilizamos várias apostilas para download, organizamos o GUJ e o InfoQ Brasil e estamos diretamente envolvidos em diversos projetos de código aberto. Há desde novos projetos como VRaptor, Restfulie e Stella, até a participação em projetos existentes como <a href="http://blog.caelum.com.br/iniciativa-caelum-open-source/#more-2459'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://opensource.org/files/garland_logo.png" width="240" />
		</p><p><img src="http://opensource.org/files/garland_logo.png" alt="open source"  align="left" style="margin:10px"/> A Caelum sempre reconheceu o poder da comunidade e do open source, e ativamente participa de ambas. Disponibilizamos várias <a href="http://www.caelum.com.br/apostilas/">apostilas para download</a>, organizamos o <a href="http://www.guj.com.br">GUJ</a>  e o <a href="http://www.infoq.com/br">InfoQ Brasil</a> e estamos diretamente <a href="http://www.caelum.com.br/opensource/">envolvidos em diversos  projetos de código aberto</a>. Há desde novos projetos como <a href="http://vraptor.caelum.com.br">VRaptor</a>, <a href="http://restfulie.caelum.com.br">Restfulie</a> e <a href="http://stella.caelum.com.br">Stella</a>, até a participação em projetos existentes como Hibernate, XStream e PicoContainer. </p>
<p>Aliás, hoje, o <strong>VRaptor</strong> é um dos principais projetos que desenvolvemos, e acaba de ter sua <a href="http://www.guj.com.br/posts/list/205109.java">versão 3.1.2 lançada</a>. A nova série 3.x já possui <a href="http://code.google.com/p/vraptor3/downloads/list?can=1&#038;q=&#038;sort=-uploaded&#038;colspec=Filename%20Summary%20Uploaded%20Size%20DownloadCount">mais de 8000 downloads</a>.</p>
<p><center><img src="http://vraptor.caelum.com.br/images/marca.png"/></center></p>
<p>O <strong>Restfulie</strong> é outro importante projeto que tem revolucionado a forma como se aplica REST hoje mundo a fora. O projeto é liderado por Guilherme Silveira que foi apresentado juntamente com Ian Robinson e Jim Webber da ThoughtWorks <a href="http://www.ws-rest.org/accepted">no WWW 2010</a>, um evento com palestrantes de peso como o &#8220;criador&#8221; da web, Tim Berns Lee. Há <a href="http://www.infoq.com/interviews/Restfulie">uma entrevista com o Guilherme</a> (em inglês) para você conhecer mais do assunto.</p>
<p>E, agora, para incentivar ainda mais a comunidade, <a href="http://www.caelum.com.br/iniciativa-open-source/">a Caelum lança sua Iniciativa Open Source</a>, que traz <strong>descontos em todos os cursos</strong> para alunos que participam de projetos de código aberto. Saiba mais na página da iniciativa e participe também com o seu projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/iniciativa-caelum-open-source/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>As dependências do Hibernate 3.5 e 3.6</title>
		<link>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/</link>
		<comments>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 22:16:52 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[c3p0]]></category>
		<category><![CDATA[connection pool]]></category>
		<category><![CDATA[dependências]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2358</guid>
		<description><![CDATA[O primeiro desafio de um iniciante em Hibernate, antes mesmo de fazer um tutorial prático, como o disponível na apostila FJ-21 da Caelum, é organizar as dependências necessárias. Até o Hibernate 3.3, a maneira a qual ele era distribuído dava trabalho pra quem precisasse usar a JPA: além do zip contendo o hibernate, era necessário <a href="http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/#more-2358'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/lib-required-dir.png" width="240" />
		</p><p>O primeiro desafio de um iniciante em Hibernate, antes mesmo de fazer um tutorial prático, como o disponível na <a href="http://www.caelum.com.br/curso/fj-21-java-web/">apostila FJ-21 da Caelum</a>, é organizar as dependências necessárias. Até o Hibernate 3.3, a maneira a qual ele era distribuído dava trabalho pra quem precisasse usar a JPA: além do zip contendo o hibernate, era necessário fazer o download de um outro jar contendo a implementação do <code>EntityManager</code> e ainda outro contendo as anotações e interfaces da JPA.</p>
<p>A versão 3.5, como a 3.6, além de trazer uma implementação da JPA2, juntou todos esses pacotes em um só. A documentação está ainda mais completa, assim como a parte explicando o processo de <a href="http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial.html#tutorial-firstapp-setup">setup do seu primeiro projeto</a>. Apesar disso, como se pode ler na documentação, ela é feita assumindo que você esteja usando o maven. Muitos iniciantes em Java ainda tem dificuldades pra encarar o Maven, ou há ainda quem prefira usar o Ant, Ivy ou gerenciar as dependências manualmente. Quais dependências preciso então para rodar uma aplicação com Hibernate 3.5/3.6?</p>
<p><strong>Para facilitar seu trabalho, <a href="http://downloads.caelum.com.br/artigos/dependencias-hibernate-3.5.0.zip">deixamos aqui um zip com todas essas dependências do Hibernate 3.5.0</a>, além de um arquivo de configuração para o Log4J, um hibernate.cfg.xml e jars opcionais</strong>.</p>
<p>Ou então você pode juntar esses jars seguindo o passo a passo:  primeiramente precisa baixar a distribuição 3.5/3.6 a partir da <a href="http://sourceforge.net/projects/hibernate/files/hibernate3/">página de downloads do hibernate no sourceforge</a>. Ao descompactá-la, encontramos os seguintes arquivos e diretórios:</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png" width="480"/></a></center></p>
<p>O <code>hibernate3.jar</code> é um jar contendo as classes fundamentais do Hibernate. Agora, dentro de <code>lib</code>, temos o diretório <code>required</code>, que são dependências que sempre precisaremos utilizar junto com o Hibernate. Todas essas 6 dependências são necessárias:</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/lib-required-dir.png" width="480" /></a></center></p>
<p>Dentro de <code>lib</code>, ainda precisamos do jar <code>hibernate-jpa-2.0-api-1.0.0.Final.jar</code> que está na pasta <code>jpa</code> para poder utilizar as anotações do Java EE. Caso você va usar o MySQL, também precisa <a href="http://dev.mysql.com/downloads/connector/j/">fazer o download do driver JDBC</a> para ele.</p>
<p>Ainda não terminou. Precisamos do nosso logging funcionando. Se você tentar executar algum exemplo agora, vai receber o conhecido <em>Exception in thread &#8220;main&#8221; java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder</em>. O SL4J, usado pelo Hibernate, é uma casca para as outras ferramentas de logging, e precisa então de um jar que indique qual logger será utilizado como backend. Na <a href="http://www.slf4j.org/dist/">página de distribuições do SL4J</a> você deve baixar a versão correspondente que está usando, seria a 1.5.8 no caso do Hibernate 3.5.0, e pegar o adaptador <code>slf4j-log4j12-1.5.8.jar</code>. Para o Hibernate 3.6.2, é necessário o  <code>slf4j-log4j12-1.6.1.jar</code>. Também precisamos do <a href="http://logging.apache.org/log4j/1.2/download.html">jar do Log4J 1.2.x</a>.</p>
<p><strong>Principais dependências opcionais</strong></p>
<p>Usar o Hibernate facilita muito o desenvolvimento com banco de dados, porém para uma performance e escalabilidade adequada <a href="http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/">é necessário ficar atento em alguns pontos fundamentais</a>, e também simples, para que ele não se torne um gargalo na sua aplicação. Dentro do diretório <code>optional</code>, destaco como essenciais o <strong>c3p0</strong> para pool de conexão e o <strong>ehcache</strong> para second level cache. O ehcache necessitará do commons-logging por sua vez.</p>
<p>Para você tirar todo o poder da JPA 2, vai querer também usar <a href="http://blogs.sun.com/ldemichiel/entry/java_persistence_2_0_proposed">a api de meta modelos</a>, e pra isso precisa do <a href="http://repository.jboss.com/maven2/org/hibernate/hibernate-jpamodelgen/1.0.0.Final/">gerador de modelos do Hibernate</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Java EE 6: Começando com Bean Validation</title>
		<link>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/</link>
		<comments>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 00:12:26 +0000</pubDate>
		<dc:creator>Lucas Souza</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[bean validation]]></category>
		<category><![CDATA[fj-26]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[hibernate validator]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[javaee6]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[jsr]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1847</guid>
		<description><![CDATA[Não existe tarefa mais comum hoje em dia do que validar dados em uma aplicação. Por exemplo, validamos se na camada de apresentação o usuário preencheu algum campo obrigatório, depois fazemos a mesma lógica de validação em nossa regra de negócio e por último validamos se os dados que serão salvos no banco também estão <a href="http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/#more-1847'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Não existe tarefa mais comum hoje em dia do que validar dados em uma aplicação. Por exemplo, validamos se na camada de apresentação o usuário preencheu algum campo obrigatório, depois fazemos a mesma lógica de validação em nossa regra de negócio e por último validamos se os dados que serão salvos no banco também estão corretos. O que na maioria das vezes os desenvolvedores fazem é validar estas regras em todos os lugares, e muitas vezes resulta em validações complicadas e possíveis erros na aplicação. Muitos desenvolvedores consideram essa tarefa enfadonha.</p>
<p>Na nova versão do Java EE lançada dezembro de 2009 existem grandes novidades: <a href="http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/">Servlets 3.0</a>, JAX-RS, CDI, JSF 2.0 e a <strong>Bean Validation</strong>, definida pela <a href="http://jcp.org/en/jsr/detail?id=303">JSR 303</a>. Com a Bean Validation é possível realizarmos validações atráves de metadados (anotações) e as utilizarmos em todas as camadas de nossa aplicação.</p>
<p>Podemos até mesmo criar nossas próprias regras de validações e aplicarmos em outros pontos do nosso sistema. Essas regras podem ser facilmente integradas com JPA e JSF, por exemplo. Vamos considerar uma classe que represente um contato:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  private String nome;

  private String email;

  // getters e setters

  public void enviaEmail() {
    // codigo envio de email
  }
}
</pre>
<p>E vamos adicionar nossas regras de validação utilizando a Bean Validation:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  @NotEmpty
  @Pattern(regexp = &quot;.+@.+\\.[a-z]+&quot;)
  private String email;

  @NotEmpty
  private String nome;

  // getters e setters

  public void enviaEmail() {
  // codigo envio de email
  }
}
</pre>
<p>A anotação <code>@NotEmpty</code> garante que o email não poderá ser vazio assim como o atributo nome. No atributo email também colocamos a anotação <code>@Pattern</code>, onde podemos passar qualquer expressão regular, que o Bean Validation validará o valor passado ao atributo <code>nome</code> com a expressão regular.</p>
<p>Lembrando que o Bean Validation é uma especificação e como toda especificação, para utilizarmos precisamos de uma implementação para a utilizarmos. A implementação usada nos exemplos é a  <a href="http://hibernate.org/subprojects/validator">Hibernate Validator</a>, e é a implementação de referência.</p>
<p><strong>Integrando com o JSF</strong></p>
<p>O código abaixo mostra um formulário simples utilizando JSF, que chama um método <code>enviaEmail </code>do ManagedBean quando clicamos no botão &#8220;<em>EnviaEmail</em>&#8220;:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;h:form id=&quot;formulario&quot;&gt;
     &lt;h:panelGrid columns=&quot;3&quot;&gt;
          &lt;h:inputText id=&quot;email&quot; value=&quot;#{contato.email}&quot;/&gt;
          &lt;h:message for=&quot;email&quot; styleClass=&quot;error&quot;/&gt;
          &lt;h:commandButton action=&quot;#{contato.enviaEmail}&quot;
               value=&quot;Enviar Email&quot;/&gt;
     &lt;/h:panelGrid&gt;
&lt;/h:form&gt;
</pre>
<p>Precisamos ainda anotar nossa classe <code>Contato</code> com <code>@ManagedBean(name="contato")</code> e <code>@RequestScoped</code> para que a mesma seja um ManageBean e consiga integrar-se com o JSF.<br />
Quando clicarmos no botão &#8220;<em>Enviar Email</em>&#8221; automaticamente será validado se o atributo <code>email </code>foi preenchido a atende a expressão regular da anotação <code>@Pattern</code>.</p>
<p>Podemos muitas vezes nos deparar com algum caso onde é necessário fazermos uma validação um pouco mais específica, algo que não esteja implementado por padrão no Bean Validation. Validar um CEP seria um bom exemplo. O primeiro passo para fazermos nossa própria validação é criar uma anotação que sugira o nome desta validação.</p>
<pre class="brush: java; title: ; notranslate">
@Constraint(validatedBy = CepValidator.class)
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cep {

  String message() default &quot;Cep inválido&quot;;
  Class&lt;?&gt;[] groups() default { };
  Class&lt;? extends Payload&gt;[] payload() default { };

}
</pre>
<p>Reparem que em nenhum momento fizemos de fato a validação se o CEP é válido ou não. Por isso anotamos a anotação CEP que acabamos de criar com <code>@Constraint</code> e setamos o atributo <code>validatedBy </code>com a classe que está nossa validação realmente.<br />
O próximo passo é criarmos a classe <code>CEPValidator</code> que fará a validação. Esta classe tem que obrigatóriamente implementar a interface <code>javax.validation.ConstraintValidator</code>:</p>
<pre class="brush: java; title: ; notranslate">
public class CepValidator implements
            ConstraintValidator&lt;Cep, String&gt; {

  private Pattern pattern =
          Pattern.compile(&quot;[0-9]{5}-[0-9]{3}&quot;);

  @Override
  public void initialize(Cep constraintAnnotation) {

  }

  @Override
  public boolean isValid(String value,
           ConstraintValidatorContext context) {
    Matcher m = pattern.matcher(value);
    return m.matches();
  }

}
</pre>
<p>No método <code>isValid</code> verificamos e retornamos um booleano dizendo se a <code>String</code> passada como argumento está de acordo com a expressão regular que criamos no topo da classe. Podemos agora validar qualquer atributo de algum Java Bean, devendo apenas anotar o atributo com a nossa recém criada <code>@CEP</code>. Por exemplo:</p>
<pre class="brush: java; title: ; notranslate">
public class Contato {

  @Cep
  private String cep;

  // getters e setters
}
</pre>
<p>Para rodar esse exemplo precisamos de um servidor de aplicação compatível com o Java EE 6, como o Glassfish 3.0. A premissa do Bean Validation é que muitos outros frameworks acabem por adotar um único mecanismo de validação, sendo possível reaproveitar o código criado aqui. O <a href="http://stella.caelum.com.br/">Caelum Stella</a>, que fornece diversos validadores para sistemas que envolvem o domínio brasileiro, em breve será compatível com essa especificação, possibilitando que você utilize-o em todas as <a href="http://www.caelum.com.br/curso/formacao-consultor-java-ee-avancado/">diversas especificações que compões o Java EE</a>.</p>
<p>Além disso precisamos de um Servidor de Aplicação compatível com a versão 6 do Java EE. Por enquanto o único servidor que implementa essa versão é o Glassfish v3.0 que por sinal também é uma implementação de referência.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/java-ee-6-comecando-com-bean-validation/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Nova versão da Apostila FJ-28 liberada com VRaptor 3.1</title>
		<link>http://blog.caelum.com.br/nova-versao-da-apostila-fj-28-liberada-com-vraptor-3-1/</link>
		<comments>http://blog.caelum.com.br/nova-versao-da-apostila-fj-28-liberada-com-vraptor-3-1/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 23:49:44 +0000</pubDate>
		<dc:creator>Lucas Cavalcanti</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[apostila]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jstl]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[vraptor]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1736</guid>
		<description><![CDATA[Depois de mais de 4000 downloads nesses 3 meses de vida, lançamos o VRaptor 3.1 com muitas novidades e bugfixes, com destaque ao suporte aos novos recursos das servlets no Java EE 6, o que permite usar o VRaptor 3 sem nem mesmo um web.xml em containers compatíveis com servlets 3.0, além de novos recursos <a href="http://blog.caelum.com.br/nova-versao-da-apostila-fj-28-liberada-com-vraptor-3-1/#more-1736'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://vraptor.caelum.com.br/images/boxVraptor-trans.png" width="240" />
		</p><p>Depois de mais de 4000 downloads nesses 3 meses de vida, lançamos o <a href="http://www.vraptor.com.br/">VRaptor</a> 3.1 com muitas <a href="http://github.com/caelum/vraptor/blob/master/vraptor-site/src/guide/pt/changelog.afc">novidades e bugfixes</a>, com destaque ao suporte aos <a href="http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/">novos recursos das servlets no Java EE 6</a>, o que permite usar o VRaptor 3 sem nem mesmo um <code>web.xml</code> em containers compatíveis com servlets 3.0, além de novos recursos para AJAX, lógicas genéricas e facilidades no mapeamento de URLs, forwards e redirects.</p>
<p><center><img src="http://vraptor.caelum.com.br/images/boxVraptor-trans.png" alt="vraptor apostila" align="center"/></center></p>
<p>Aproveitando o lançamento dessa nova versão do framework, estamos disponibilizando a atualização da apostila do curso <a href="http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/">FJ-28 de VRaptor, Hibernate e AJAX</a>, que já está <a href="http://www.caelum.com.br/apostilas/">disponível para download</a>. O material não abrange apenas VRaptor, Hibernate e JSP, mas também entra em detalhes de como fazer a costura de maneira correta, gerenciando suas <code>Sessions</code>, <code>Transactions</code>, etc, através da criação de uma webapplication desde o zero.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/nova-versao-da-apostila-fj-28-liberada-com-vraptor-3-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

