<?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>Lucas Teixeira &#187; hibernate</title>
	<atom:link href="http://lucastex.com.br/tag/hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Mon, 19 Jul 2010 11:39:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Criando um tipo de dados personalizado no Grails + Hibernate</title>
		<link>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/</link>
		<comments>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 11:39:24 +0000</pubDate>
		<dc:creator>Volnei Munhoz</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[boolean]]></category>
		<category><![CDATA[usertype]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=388</guid>
		<description><![CDATA[

Olá Pessoal,
Estou invadindo o Blog do meu grande amigo Lucas para postar uma solução que encontrei para um problema no mapeamento de dados de uma base de dados existente. Gostaria, em primeiro lugar, de agradecer o espaço cedido pelo Lucas e parabenizá-lo pelo excelente Blog.
Hoje em dia são poucos os projetos que precisamos desenvolver do [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F07%252F19%252Fcriando-um-tipo-de-dados-personalizado-no-grails-hibernate%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbkhFEI%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Criando%20um%20tipo%20de%20dados%20personalizado%20no%20Grails%20%2B%20Hibernate%22%20%7D);"></div>
<p>Olá Pessoal,</p>
<p>Estou invadindo o Blog do meu grande amigo Lucas para postar uma solução que encontrei para um problema no mapeamento de dados de uma base de dados existente. Gostaria, em primeiro lugar, de agradecer o espaço cedido pelo Lucas e parabenizá-lo pelo excelente Blog.</p>
<p>Hoje em dia são poucos os projetos que precisamos desenvolver do zero &#8212; criar modelagem, tabelas e etc&#8230; &#8212; por isso é muito comum depararmos com padrões proprietários que muitas vezes não se &#8220;encaixam&#8221; na ferramenta de desenvolvimento. Não preciso dizer que não é uma tarefa fácil convencer os desenvolvedores a se adequarem aos novos padrões, então, se não pode com eles, una-se a eles.</p>
<p>Bom, vamos direto ao assunto, no meu projeto atual me deparei com um padrão que utiliza &#8216;S&#8217; e &#8216;N&#8217; para o mapeamento de propriedades booleanas no banco de dados Oracle. Na pesquisa que realizei encontrei várias pseudo-soluções mas a única que atendeu 100% as necessidades foi a implementação de um tipo de dados do Hibernate.</p>
<p>Abaixo a implementação da classe SNUserType, não tem segredo é apenas a implementação da interface <strong>org.hibernate.usertype.UserType</strong>. Salve este código no pacote <strong>persistence</strong> na pasta de <strong>src/groovy</strong> do seu projeto Grails.</p>
<pre class="brush: groovy;">package persistence;

import org.hibernate.*;
import org.hibernate.usertype.*;
import java.sql.*;
import java.util.*;
import java.io.Serializable;

public class SNUserType implements UserType {

   def SQL_TYPES = [Hibernate.YES_NO.sqlType()];

   public int[] sqlTypes() {
      return SQL_TYPES;
   }

   private Class targetClass;

   public void setParameterValues(Properties params) {
      String targetClassName = params.getProperty(&quot;targetClass&quot;);
      try {
         targetClass = Class.forName(targetClassName);
      } catch (ClassNotFoundException e) {
         throw new HibernateException(&quot;Class &quot; + targetClassName + &quot; not found &quot;, e);
      }
   }

   public Class returnedClass() {
      return targetClass;
   }

   public boolean isMutable() {
      return false;
   }

   public Object deepCopy(Object value) {
      return value;
   }

   public Serializable disassemble(Object value) {
      return (Serializable) value;
   }

   public Object assemble(Serializable cached, Object owner) {
      return cached;
   }

   public Object replace(Object original, Object target, Object owner) {
      return original;
   }

   public boolean equals(Object x, Object y) {
      if (x == y)
         return true;
      if (x == null || y == null)
         return false;
      return x.equals(y);
   }

   public int hashCode(Object x) {
      return x.hashCode();
   }

   public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
      String value = rs.getString(names[0]);
      if (&quot;S&quot;.equals(value))
         return true;
      else
         return false;
   }

   public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException {
      if (value == null) {
         ps.setNull(index, Hibernate.YES_NO.sqlType());
      } else {
         if((Boolean)value) {
            ps.setString(index, &quot;S&quot;);
         } else {
            ps.setString(index, &quot;N&quot;);
         }
      }
   }
}</pre>
<p>Pronto, agora tudo que você precisa fazer é utilizar o novo tipo de dados no mapeamento de suas classes de domínio.</p>
<pre class="brush: groovy;">class Pessoa {

   String nome
   Boolean ativo

   static mapping = {
      ativo type: &quot;persistence.SNUserType&quot;
   }

}</pre>
<p>Com isso, resolvi o problema de integração e concluímos este post.</p>
<p>Um abraço</p>
<p>Volnei</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/07/19/criando-um-tipo-de-dados-personalizado-no-grails-hibernate/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Como fazer o deploy de uma app grails no JBoss</title>
		<link>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/</link>
		<comments>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 12:51:56 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jar]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[validator]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=289</guid>
		<description><![CDATA[

Neste fim de semana quis fazer alguns testes pela primeira vez com uma aplicação grails no jboss.
Já tinha acompanhado na grails-users que existem alguns problemas para efetuar o deploy, e para cada um deles, uma sequência de passos obscuros para fazer o deploy acontecer com sucesso. Minha versão de grails neste procedimento é a 1.2.1 [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F02%252F14%252Fcomo-fazer-o-deploy-de-uma-app-grails-no-jboss%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FdCFz4H%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Como%20fazer%20o%20deploy%20de%20uma%20app%20grails%20no%20JBoss%20%22%20%7D);"></div>
<p>Neste fim de semana quis fazer alguns testes pela primeira vez com uma aplicação grails no jboss.</p>
<p>Já tinha acompanhado na <strong>grails-users</strong> que existem alguns problemas para efetuar o deploy, e para cada um deles, uma sequência de passos obscuros para fazer o deploy acontecer com sucesso. Minha versão de grails neste procedimento é a 1.2.1 e do JBoss é a 5.1.0.GA</p>
<p>Efetivamente, o que acontece é que jboss traz junto com suas common libs vários jars que são empacotados juntamente com a sua aplicação quando você utiliza o comando <strong>grails war</strong>.</p>
<p>Existem alguns workarounds na internet que te mostram como modificar o <strong>BuildConfig.groovy</strong> (arquivo que define propriedades do empacotamento de sua app) para que após montar a estrutura de arquivos que irão ser empacotados, remova estes arquivos (principalmente o log4j onde o problema é mais aparente) do chamado <strong>stagingDir</strong> e os deixe de fora do pacote final.</p>
<p>Particularmente, achei a solução <a href="http://www.comerciaisnet.com.br/clientes/difermig_representacoes/minasul/marreta.jpg" target="_blank">um tanto quanto diferente</a> e acabei achando no <a href="http://www.grails.org/FAQ" target="_blank">FAQ do Grails</a> e depois com mais detalhes <a href="http://community.jboss.org/wiki/ClassLoadingConfiguration" target="_blank">nesta página</a> uma solução menos intrusiva ao pacote, que é definir a prioridade de carregamento dos jars da aplicação.</p>
<p>Bom, para isso, precisamos criar um arquivo <strong>jboss-web.xml</strong> dentro do diretório <strong>WEB-INF</strong> de nossa aplicação que irá mostrar ao jboss que queremos &#8220;blindar&#8221; nossa aplicação para utilizar os jars que estão dentro de seu lib, e que estes por sua vez não deverão ser sobrescritos pelos jars do classpath do servidor. O conteúdo do arquivo segue abaixo:</p>
<pre class="brush: xml;">&lt;jboss-web&gt;
   &lt;context-root&gt;/projeto&lt;/context-root&gt;
   &lt;class-loading java2ClassLoadingCompliance=&quot;false&quot;&gt;
      &lt;loader-repository&gt;
         projeto:archive=projeto.war
         &lt;loader-repository-config&gt;java2ParentDelegation=false&lt;/loader-repository-config&gt;
      &lt;/loader-repository&gt;
   &lt;/class-loading&gt;
&lt;/jboss-web&gt;</pre>
<p>Na tag <strong>context-root</strong> estamos apenas aproveitando que a aplicação terá seu arquivo de configuração específico para o jboss e definindo o contexto em que ela será publicada. Nas tags seguintes pedimos para o jboss criar o nosso classloader isolado, com o nome &#8220;projeto:archive=projeto.war&#8221;. Com este nome (que deve ser único, por isto leva em consideração o nome do projeto), garantimos que as classes pedidas pelo nosso projeto serão procuradas ali, e caso não encontradas, nos classpaths seguintes (common/lib, depois no tomcat).</p>
<p>Basicamente isto seria suficiente para conseguir que o projeto rodasse sem problemas. Porém no meu cenário de versões (grails 1.2.1 e jboss-5.1.0.GA) existe outro ponto de conflito. O Hibernate Validator que está junto ao jboss também difere em versão e gera conflito com o grails. Neste caso a solução é <a href="http://www.comerciaisnet.com.br/clientes/difermig_representacoes/minasul/marreta.jpg" target="_blank">ainda mais interessante</a> e simples que a anterior.</p>
<p>Para resolver o problema no deploy que indica claramente problema de versão no Hibernate Validator, basta que você faça o download da última versão deste jar (no meu caso, 4.0.2-GA) nesta url: <a href="https://www.hibernate.org/30.html" target="_blank">https://www.hibernate.org/30.html</a>. Depois disto, resta apenas colocar o jar do hibernate validator dentro da pasta <strong>&lt;jboss_home&gt;/common/lib</strong>.</p>
<p>Pronto, a aplicação está rodando e funcional dentro do jboss!</p>
<pre class="brush: plain;">10:36:32,815 INFO  [[/projeto]] Initializing Spring root WebApplicationContext
10:36:41,155 INFO  [[/projeto]] Initializing Spring FrameworkServlet 'grails'</pre>
<p>PS: Vale lembrar que o arquivo <strong>jboss-web.xml</strong> é padrão para arquivos <strong>war</strong>, se você quiser configurar a ordem do classpath para aplicações <strong>ear</strong> ou<strong> sar</strong>, consulte o link acima para entender as diferenças.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/02/14/como-fazer-o-deploy-de-uma-app-grails-no-jboss/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Grails e GORM: Logando as consultas SQL no console</title>
		<link>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/</link>
		<comments>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 13:38:57 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[GORM]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=137</guid>
		<description><![CDATA[

Uma dica pra acompanhar o uso do seu banco de dados, e saber o que o hibernate e o gorm estão fazendo por trás dos panos, é logar as queries que estão sendo feitas.
Você pode acompanhar isto detalhadamente configurando seu DataSource.groovy para fazer isso com o parâmetro loggingSql. E o mais bacana na minha opinião [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F11%252F05%252Fgrails-e-gorm-logando-as-consultas-sql-no-console%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Grails%20e%20GORM%3A%20Logando%20as%20consultas%20SQL%20no%20console%22%20%7D);"></div>
<p>Uma dica pra acompanhar o uso do seu banco de dados, e saber o que o <a href="https://www.hibernate.org/" target="_blank">hibernate</a> e o <a href="http://grails.org/GORM" target="_blank">gorm</a> estão fazendo por trás dos panos, é logar as queries que estão sendo feitas.</p>
<p>Você pode acompanhar isto detalhadamente configurando seu <strong>DataSource.groovy </strong>para fazer isso com o parâmetro <strong>loggingSql</strong>. E o mais bacana na minha opinião é poder fazer isso de forma independente para cada ambiente. Lembre-se que por default esta configuração vem desligada.</p>
<pre class="brush: groovy;">environments {
  development {
    dataSource {
      url = &quot;...&quot;    //banco de dev
      loggingSql = true
    }
  }
  test {
    dataSource {
      url = &quot;...&quot; //banco de testes
    }
  }
  production {
    dataSource {
      url = &quot;...&quot; //banco de produção
    }
  }
}</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/05/grails-e-gorm-logando-as-consultas-sql-no-console/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
