<?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 do Alone</title>
	<atom:link href="http://www.nelsonalone.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nelsonalone.com.br</link>
	<description>A tecnologia de forma simplificada</description>
	<lastBuildDate>Tue, 21 Feb 2012 11:29:22 +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>Hibernate Envers: Consultas</title>
		<link>http://www.nelsonalone.com.br/2012/02/21/hibernate-envers-consultas/</link>
		<comments>http://www.nelsonalone.com.br/2012/02/21/hibernate-envers-consultas/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 11:29:22 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Persistência]]></category>
		<category><![CDATA[envers]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=647</guid>
		<description><![CDATA[No post anterior, eu tinha dito que faria um outro post  apenas para dar ênfase nas consultas dos objetos marcados para serem auditados. Foi necessário concentrar esses assuntos em um post pois existem algumas particularidades que só as consultas com objetos auditáveis tem. Portanto, vamos a elas. As consultas que são utilizadas pelo Envers são<a href="http://www.nelsonalone.com.br/2012/02/21/hibernate-envers-consultas/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No post anterior, eu tinha dito que faria um outro post  apenas para dar ênfase nas consultas dos objetos marcados para serem auditados. Foi necessário concentrar esses assuntos em um post pois existem algumas particularidades que só as consultas com objetos auditáveis tem. Portanto, vamos a elas.</p>
<p style="text-align: justify;">As consultas que são utilizadas pelo Envers são semelhantes ao modelo criteria, recurso nativo do Hibernate. O framework permite a consulta em duas dimensões: a primeira, horizontal, corresponde ao estado do banco de dados em uma dada revisão. A  segunda, vertical, são as revisões na qual as entidades são modificadas.</p>
<p style="text-align: justify;">A documentação afirma que a principal limitação, quando se trata de queries, são as consultas com relacionamento  entre os objetos, recurso não suportado previamente pelo framework. Outro fator negativo é o fato das consultas aparentarem ser mais lentas que as consultas sobre os dados ditos “vivos”, ou melhor, os dados das entidades na qual o banco de dados foi projetado. Porém, é um recursos interessante, já que o framework da uma certa facilidade para a realização das consultas. Agora, nada impede de vc utilizar sql nativo para obter os dados de auditoria. Basta apenas compreender o schema e o mapeamento das chaves.</p>
<h4 style="text-align: justify;"></h4>
<h4 style="text-align: justify;">DETALHES DE USO</h4>
<p style="text-align: justify;">Os recursos disponíveis para a elaboração de consultas sobre os objetos de auditoria são simples de serem utilizados. A princípio é necessário obter um objeto chamado AuditReader de um EntityManager para poder realizar as consultas. A forma de obter tal objeto é descrita abaixo:</p>
<pre class="brush:java">AuditReader reader = AuditReaderFactory.get(em);</pre>
<p style="text-align: justify;">Através desse objeto é possível utilizar os métodos de consulta existente na interface, ou melhor, utilizar os recursos, mesmo que capados, de criteria sobre os dados de auditoria, como abaixo:</p>
<pre class="brush:java">List result = reader.createQuery()
    .forRevisionsOfEntity(classe, false, false)
    .add(AuditEntity.id().eq(id))
    .getResultList();</pre>
<p style="text-align: justify;">Só uma observação; na documentação do produto, apesar de bem branda, está incompatível com os recursos disponíveis na versão 4 do hibernate. Pra quem ainda não sabe, o envers foi incorporado a arvore do hibernate para formar um produto apenas. Com isso, a documentação oficial está desatualizada com release principal do produto. Porém, as consultas são funcionais. Você pode utiliza-las como modelo para a elaboração de suas consultas.</p>
<h4 style="text-align: justify;">DADOS DE AUDITORIA PERSONALIZADOS</h4>
<p style="text-align: justify;">Existe um recurso que foi muito útil para elaborar uma determinada consulta. Por padrão,  as tabelas _AUD, geradas pelo framework, não armazena a data da alteração e nem mesmo quem alterou. Claro, isso, na maioria das vezes, fica por conta da implementação. Porém, caso seja necessário incluir dados amais sobre os objetos auditados é possível armazena-los em uma entidade sem a interferência no mapeamento do seu sistema. Isso é possível utilizando dois recursos: a anotação @RevisionEntity em conjunto com a interface RevisionListener. A classe que for anotada com @RevisionEntity deverá ter duas propriedades como equisito:</p>
<ul style="text-align: justify;">
<li>um in ou long, anotado com @RevisionNumber, frequentemente um campo com valores gerados automaticamente</li>
</ul>
<ul style="text-align: justify;">
<li>um long ou um java.util.Date anotado com @RevisionTimeStamp, que seria mais um atributo preenchido pelo Envers.</li>
</ul>
<p style="text-align: justify;">Dica: caso não queira incluir os atributos de pré-requisito, utilize a anotação default: @DefaultRevisionEntity. Isso elimina completamente a necessidade de criação dos atributos de pré-requisito.</p>
<p style="text-align: justify;">Após isso, é possível adicionar qualquer atributo a mais para suprir suas necessidades. Esses atributos serão persistidos como uma entidade normal. Tanto que, será necessário incluir a classes que armazenará esses atributos no persistence.xml.</p>
<p style="text-align: justify;">O processo de criação aparentemente parece que está ok. Agora a pergunta é: Como esses dados serão armazenados? Isso é feito através de um listener que contem um método que é executado a cada modificação de uma entidade auditada. Portando, o trabalho de setar os valores fica por conta do programador. Abaixo está o listener utilizado como exemplo ilustrado na documentação oficial:</p>
<pre class="brush:java">public class ExampleListener implements RevisionListener {
    public void newRevision(Object revisionEntity) {
        ExampleRevEntity exampleRevEntity = (ExampleRevEntity) revisionEntity; Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");
        exampleRevEntity.setUsername(identity.getUsername());
    }
}</pre>
<p style="text-align: justify;"><strong><br />
</strong></p>
<p style="text-align: justify;">Fica ao critério do programador quais são os dados que serão armazenados e quando. Portanto, em um exemplo que fiz pra testar esses recurso inclui apenas o login do usuário informando quem foi o autor da alteração:</p>
<pre class="brush:java">public class EnversRevisionListener implements RevisionListener {

     @Override
     public void newRevision(Object revisionEntity) {
          Map&lt;String,Object&gt; session = ActionContext.getContext().getSession();
          if(session != null) {
              ApplicationUserElementSession userSession = (ApplicationUserElementSession) session.get(Constants.APPLICATION_USER_SESSION);
              LoginRevEntity exampleRevEntity = (LoginRevEntity) revisionEntity;
              exampleRevEntity.setTimestamp(new Date().getTime());

              if(userSession != null)  {
                  User userAutenticated = userSession.getUserAutenticate();
                  exampleRevEntity.setUsuario(userAutenticated.getLogin());
              }

              else {
                  exampleRevEntity.setUsuario("new_user");
              }
          }
     }
}</pre>
<p style="text-align: justify;">A dica transmitida nesse post extrapolou um pouco. Foi além de consulta para auditoria personalizada. O que foi passado aqui foi apenas uma introdução, ou melhor, um subconjunto dos recursos que precisei para desenvolver meus métodos de auditoria. A documentação, apesar de desatualizada, é bem direta e simples de ser seguida. Porem, aconselho vc baixar o código do hibernate pelo github. No raiz vc vai encontrar o diretório hibernate-envers. É lá que está a nova versão do envers que é distribuída com o framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/02/21/hibernate-envers-consultas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Auditoria com Envers</title>
		<link>http://www.nelsonalone.com.br/2012/02/08/auditoria-com-envers/</link>
		<comments>http://www.nelsonalone.com.br/2012/02/08/auditoria-com-envers/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 03:29:35 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Persistência]]></category>
		<category><![CDATA[envers]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=637</guid>
		<description><![CDATA[Qual o desenvolvedor que nunca foi questionado sobre a possibilidade de obter relatórios de quem modificou uma determinada informação? Se nunca aconteceu isso com você então pode esperar, isso é certo, vai acontecer. Soluções de auditoria podem ser encontradas em todas as linguagens através de frameworks e tutoriais que solucionam um determinado contexto. Assegurar um<a href="http://www.nelsonalone.com.br/2012/02/08/auditoria-com-envers/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Qual o desenvolvedor que nunca foi questionado sobre a possibilidade de obter relatórios de quem modificou uma determinada informação? Se nunca aconteceu isso com você então pode esperar, isso é certo, vai acontecer.</p>
<p style="text-align: justify;">Soluções de auditoria podem ser encontradas em todas as linguagens através de <em>frameworks</em> e tutoriais que solucionam um determinado contexto. Assegurar um modelo comum tem sua parcela de dificuldade mas, de modo geral, é possível adquirir muita vantagem nesse ponto.</p>
<p style="text-align: justify;"><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/como-e-uma-auditoria-ppqa-564x272.jpg"><img class="aligncenter size-full wp-image-639" title="como-e-uma-auditoria-ppqa-564x272" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/como-e-uma-auditoria-ppqa-564x272.jpg" alt="" width="564" height="272" /></a></p>
<p>&nbsp;</p>
<p style="text-align: justify;">Um tempo atrás, me deparei com uma situação para auditar tudo o que acontece na camada de persistência, com o objetivo de gerenciar todo o conjunto de modificações de objeto que continham valores monetários. Os gerentes queriam saber a procedência de alteração de uma série de elementos que foram armazenados, inclusive quem os armazenou e qual foi a URL executada para remove-lo. Nesse caso, foi necessário desenvolver uma série de <em>listeners</em> para realizar a leitura de elementos contidos na sessão e armazena-los. Porém, quando se trata de aplicações corporativas, normalmente estão espalhadas em outros servidores, normalmente provendo serviços que outras aplicações acessam. O maior problema disso tudo é que armazenar o histórico de um objeto em uma outra base de dados, normalmente com o auxílio desses serviços (seja EJB, Web Services ou RESt) é um trabalho a mais, gerando um deley desnecessário para a aplicação. Em muitos casos, o armazenamento dos logs no <em>schema</em> utilizado pela aplicação minimizaria consideravelmente o fator tempo utilizado para o complemento da transação .</p>
<p style="text-align: justify;">No mundo Java, o <em>framewok</em> predominante é o <em>Hibernate</em>. É muito difícil projetar um aplicação que não utilize o framework para mapeamento objeto-relacional da linguagem Java. É um excelente framework, na minha opinião, o mais bem sucedido quando se trata de funcionalidades providas por frameworks. A auditoria realizada com esse <em>fremework</em> pode ser feita utilizando <em>listeners</em> e que executam call-backs dispondo de eventos que podem executar ações antes ou depois da persistência de objetos. Ainda assim, a dificuldade e o tempo de desenvolvimento de uma solução mais viável e rápida fica a desejar.  Dessa forma, para preencher a lacuna, utilizaríamos recursos de aspectos do Spring para uma coisa mais elaborada. Manter uma solução como essa, em certos pontos, despadronizada e mal documentada, se tornaria um caos. Normalmente tratativas reais no ambiente onde se desenvolve o software.</p>
<p style="text-align: justify;"><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/hibernate.png"><img class="aligncenter size-full wp-image-640" title="hibernate" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/hibernate.png" alt="" width="250" height="240" /></a></p>
<p style="text-align: justify;">Hoje em dia, acompanhado desse <em>framework</em> está o <em>Envers</em>, que é um framework de auditoria nativo do <em>Hibernate</em>, tanto que ele vem <a title="Envers junt-se ao hibernate" href="http://www.infoq.com/br/news/2008/12/envers_joins_hibernate">junto com o pacote distribuído no site do produto</a>.</p>
<p style="text-align: justify;">Resolvi testar o <em>Envers</em> em uma aplicação piloto para conhecer as funcionalidades de auditoria provida por esse framework. Logo de primeira, fiquei impressionado com a facilidades de integração com o <em>Hibernate</em>. É só incluir a lib e utilizar as anotações. Só isso e nada mais. Porém, o framework tem suas particularidades. Para cada entidade que deseja auditar é necessário incluir uma anotação, seja ela no atributo em questão ou no todo da classe para anotar todos os atributos. Após rodar o projeto, no momento da atualização do <em>schema</em>, será criada a tabela de auditoria como o complemento do nome “AUD”.</p>
<p style="text-align: justify;">
<p style="text-align: justify;"> Em objeto de classe que for anotada com @<em>Audited</em>, será gerada uma estrutura semelhando ao desenho acima. As tabelas “AUD” armazenam os atributos da classe que foram anotadas.</p>
<p style="text-align: justify;">Nem sempre o que o <em>framework </em>oferece é o suficiente para executar por completo nossos requisitos de negócio. De acordo com a configuração default, foi oferecido ao desenvolvedor registrar as modificações dos objetos com revisões. Porém, em algumas situações, talvez necessitamos de um conjunto de informações mais rico. Ou melhor, precisamos registrar a data que o objeto foi modificado, por quem e qual o caminho que o usuário percorreu até concluir o conjunto de funcionalidades.</p>
<p style="text-align: justify;">Para isso, será necessário a inclusão de dois elemento para que possam trabalhar em conjunto. A anotação @<em>RevisionEntity</em> e o <em>listener</em> <em>RevisionListener</em>.</p>
<p style="text-align: justify;">A anotação permite escolher uma classe que representará uma entidade que irá conter os atributos a mais necessários para serem armazenados. O <em>listener</em> incluirá de escutar a modificação realizada no objeto e executar um método para executar alguma programação que, na maioria das vezes, seria uma extração de informação de algum objeto que está na sessão ou de um método de armazenamento temporário de objetos. Isso ficaria mais ou menos assim:</p>
<p style="text-align: justify;"><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/Captura-de-Tela-2012-02-07-às-23.00.15.png"><img class="aligncenter size-full wp-image-638" title="Captura de Tela 2012-02-07 às 23.00.15" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/02/Captura-de-Tela-2012-02-07-às-23.00.15.png" alt="" width="962" height="330" /></a></p>
<p style="text-align: justify;">A cada modificação realizada o método <em>newRevision </em>é executado, podendo aí utilizar do mecanismo para preencher os campos da entidade auxiliar.</p>
<p style="text-align: justify;">Esses são apenas recursos que considero o mais básico possível que uma aplicação de médio porte pode ter. O <em>Envers</em> possui mais recursos para armazenamento, cujo conteúdo está disponível na documentação do produto.</p>
<p style="text-align: justify;">As consultas são um caso a parte. O <em>Envers</em> utiliza o conceito de revisão, uma ideia bem semelhante ao <em>Subversion</em>, fazendo com que cada modificação realizada no objeto gere uma nova revisão. A revisão é armazenada juntamente com os dados que foram modificados, inclusive o seu tipo de modificação que foi realizada.</p>
<p style="text-align: justify;">A ideia dos tipos de transação são bem claros quando olhamos o dados armazenados. No teste que eu fiz no MySQL podemos ver o campo REVTYPE. Onde é armazenado os tipos de modificações realizadas no objeto:</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/02/08/auditoria-com-envers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac os Lion: Onde fica os scripts do MySQL</title>
		<link>http://www.nelsonalone.com.br/2012/01/27/mac-os-lion-onde-fica-os-scripts-do-mysql/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/27/mac-os-lion-onde-fica-os-scripts-do-mysql/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 11:27:20 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Lion]]></category>
		<category><![CDATA[Mac OS]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=632</guid>
		<description><![CDATA[Quando instalamos o mysql no Mac OS Lion pela primeira vez, isso sem auxílio do Mac Port ou semelhantes, ficamos um pouco perdidos com relação aos scripts que inicia o serviço e, normalmente, chegamos a utilizar o utilitário que vem com o pacote pra iniciar o serviço. Quem vem do mundo UNIX/Linux fica um pouco<a href="http://www.nelsonalone.com.br/2012/01/27/mac-os-lion-onde-fica-os-scripts-do-mysql/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Quando instalamos o mysql no Mac OS Lion pela primeira vez, isso sem auxílio do Mac Port ou semelhantes, ficamos um pouco perdidos com relação aos scripts que inicia o serviço e, normalmente, chegamos a utilizar o utilitário que vem com o pacote pra iniciar o serviço. Quem vem do mundo UNIX/Linux fica um pouco perdido quando queremos criar scripts mais elaborados, utilização do cron, etc.</p>
<p style="text-align: justify;">Quando instalamos o pacote, normalmente ele é encontrado do diretório /usr/local/mysql/support-files. Aqui é possível encontrar uma série de scripts que podem facilitar muito a vida de que utiliza o mysql. Inclusive o arquivo mysql.server que contem as diretivas para iniciar, reiniciar e parar. Normalmente tentaria-mos encontrar esses arquivos no diretório /etc/init.d/.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/27/mac-os-lion-onde-fica-os-scripts-do-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss 7 e o problema com o Dom4j</title>
		<link>http://www.nelsonalone.com.br/2012/01/25/jboss-7-e-o-problema-com-o-dom4j/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/25/jboss-7-e-o-problema-com-o-dom4j/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 17:05:57 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[JDom]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=626</guid>
		<description><![CDATA[Pra quem iniciou o JBoss 7 com projetos que utilizam a lib Dom4j deve ter deparado com o erro org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory. Esse erro acontece que nas libs do JBoss já existe a mesma biblioteca. Quando é feito o deploy, ou executado standalone, esse erro acontece. Não adianta remover a lib do<a href="http://www.nelsonalone.com.br/2012/01/25/jboss-7-e-o-problema-com-o-dom4j/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pra quem iniciou o JBoss 7 com projetos que utilizam a lib Dom4j deve ter deparado <strong><em>com o erro org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory</em></strong>.</p>
<p style="text-align: justify;">Esse erro acontece que nas libs do JBoss já existe a mesma biblioteca. Quando é feito o deploy, ou executado standalone, esse erro acontece. Não adianta remover a lib do classpath da aplicação. Pode ater dar certo mas, se sua aplicação depende dela, talvez os testes automatizados não sejam executados corretamente.</p>
<p style="text-align: justify;">Para solucionar esse problema em uma aplicação web simples, é necessário informar ao JBoss que essa lib é necessária para o projeto. Para isso, é só incluir a linha abaixo no arquivo MANIFEST.MF: <em>Dependencies: org.dom4j</em>. No momento do deploy o JBoss ler esse arquivo para tentar encontrar diretivas utilizadas para gerenciar o ClassLoader da aplicação e gerenciar a dependência de módulos.</p>
<p style="text-align: justify;">Espero ter ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/25/jboss-7-e-o-problema-com-o-dom4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Anti-Patterns</title>
		<link>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 11:01:49 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Anti-Pattern]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=618</guid>
		<description><![CDATA[No dia-dia nos deparamos com situações que não sabemos  a melhor forma soluciona-la, levando, as vezes, utilizar de soluções conhecidas como Anti-Pattern. As ferramentas de análise de código ajudam um pouco, mas não chegam a ser imediatas quando precisamos. Nesse caso, a melhor ferramenta é a nossa cachola. Encontrei nesse blog um número repleto de<a href="http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No dia-dia nos deparamos com situações que não sabemos  a melhor forma soluciona-la, levando, as vezes, utilizar de soluções conhecidas como Anti-Pattern. As ferramentas de análise de código ajudam um pouco, mas não chegam a ser imediatas quando precisamos.</p>
<p style="text-align: justify;">Nesse caso, a melhor ferramenta é a nossa cachola. Encontrei nesse blog um número repleto de dicas para solucionar os problemas de Anti-Pattern que utilizamos no dia-dia. Desde dicas de performance até soluções para determinados problemas. Vale a pena dar uma olhada. <a href="http://www.odi.ch/prog/design/newbies.php">Odi’s Blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/25/java-anti-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Steve Jobs por Walter Isaacson. Uma simples opinião.</title>
		<link>http://www.nelsonalone.com.br/2012/01/24/steve-jobs-por-walter-isaacson-uma-simples-opiniao/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/24/steve-jobs-por-walter-isaacson-uma-simples-opiniao/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 16:20:13 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Off-Toppic]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[Walter Isaacson]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=610</guid>
		<description><![CDATA[Olá, Terminei de ler o livro essa semana e queria escrever alguma coisa sobre o que eu li. Também expressar  minha opinião sobre a figura de Steve Jobs. Acredito que não exista nada melhor do que olhar pra trás e ver seus feitos, criações, ideias que foram concretizadas. Também, acredito que deve ser a mesma<a href="http://www.nelsonalone.com.br/2012/01/24/steve-jobs-por-walter-isaacson-uma-simples-opiniao/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá,</p>
<p style="text-align: justify;">Terminei de ler o livro essa semana e queria escrever alguma coisa sobre o que eu li. Também expressar  minha opinião sobre a figura de Steve Jobs.</p>
<p style="text-align: justify;"><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/01/steve-jobs-by-walter-isaacson.jpg"><img class="aligncenter size-medium wp-image-611" title="steve-jobs-by-walter-isaacson" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/01/steve-jobs-by-walter-isaacson-300x262.jpg" alt="" width="300" height="262" /></a></p>
<p style="text-align: justify;">Acredito que não exista nada melhor do que olhar pra trás e ver seus feitos, criações, ideias que foram concretizadas. Também, acredito que deve ser a mesma coisa quando olhamos em volta, no próprio presente, e vemos os frutos de nossos esforços que foram feitos no passado. Uma vez, ao ler a biografia de Albert Einstein, li uma frase fabulosa; “Quando olhamos para uma fórmula, nos deparamos com números, constantes e símbolos para que nos trás um determinado resultado. Mas, muitas coisas se escondem através dessas formulas, noites em claro, um certo distanciamento dos seus familiares, críticas e esforço pra prova-las para pessoas incrédulas, lágrimas e um pouco de cabelos brancos.  Se conseguíssemos olhar profundamente em cada criação humana poderíamos ver a dor e o sacrifício, que, são sempre maiores que o mérito atribuído pela criação”.</p>
<p style="text-align: justify;">A biografia de Steve Jobs contada por Walter Isaacson teve um grande sucesso em alcançar exatamente o ponto do sacrifício, foco e a dor que envolvem uma criação. Em cada ponto da obra existe conflitos e principalmente a explosão do temperamento de Jobs em diversas situações e momentos, no trabalho, família e amigos. Mesmo assim, em alguns momentos, são feitos que contém méritos, pois, ele conseguia tirar o máximo dos seus funcionários. Coisas que eram declaradas como impossíveis de serem realizadas, eram feitas e no tempo estabelecido por ele. Realmente, devia ser uma coisa estressante trabalhar a base do grito e com um líder que tinha uma constantes explosões de personalidade.</p>
<p style="text-align: justify;">Muitos podem afirmar que Jobs era um tremendo de um mal caráter salafrário sem coração. Sim, depois que eu li sua biografia é essa a conclusão que tirei. Até mesmo de leitura das primeiras cinquenta páginas é possível tirar essa conclusão. Mas a questão é: porque isso tudo? Porque ele teve tanto sucesso? Bom. Eu nunca saberei responder porque eu não trabalhei com ele, mas a minha suposição é que: ele utilizava a abordagem do chicote pra tirar todo o potencial de uma pessoa. Se ele visse potencial naquele indivíduo ele iria descasca-lo até conseguir o que queria. Isso não é uma boa abordagem, mas funcionava com ele.</p>
<p style="text-align: justify;">Enquanto estamos tentando diminuir o máximo possível o tempo das reuniões, as suas duravam no mínimo três horas. O fato de ser meticuloso e da necessidade de ter o controle da situação por completo levava ao limite  as pessoas de sua confiança. Uma coisa é certa, o mesmo olhar que via no Senna quando ele conversava com os engenheiros e em suas reuniões. Isso é possível ver em Jobs nos poucos momentos que se deixou filmar trabalhando. A seriedade e a atenção, quase que hipnótica, era perceptível em suas feições quando travam de assuntos do seu interesse. Para Senna, isso era imprescindível, pois tinha um carro inferior aos demais, portanto, era necessário conhecer seus limites ao máximo para poder lava-lo a vitória. Para Jobs, sua ânsia  de criar produtos e, ao mesmo tempo,  a vontade de derrubar IBM tornou-se seu principal elemento de motivação.</p>
<p style="text-align: justify;">A Paixão. Isascson, em muitos pontos do texto, cita a paixão como ponto fundamental para a motivação de Jobs. Acredito que até mesmo para o seu time. Ele conseguia ver isso nos demais. Olhava nos olhos dos seus de seus funcionários tentando encontrar a paixão por produzir coisas novas, de tirar o que tinha em sua cabeça e pode materializar em alguma coisa inovadora. Ele conseguia fazer isso como ninguém.</p>
<p style="text-align: justify;">Uma das coisas que Jobs sempre falava era de ter amor e orgulho do que se fabricava. Isso não está na biografia, mas no livro “A Cabeça de Steve Jobs”; quando ele voltou para a Apple, se deparou com inúmeros funcionários falando mal dos produtos que foram criados. Isso deixou Jobs com uma raiva enorme e sempre que escutada isso de algum funcionário ele “estevava” (termo criado pelos funcionários da Apple quando das humilhações que eram feitas em público aos seus funcionários) o sujeito lá mesmo. Só que, em várias reuniões ele mesmo afirmava que os produtos que a Apple fez, até o momento que ele estava fora, era tremenda porcaria. Mas o que ele queria despertar nas pessoas era o amor. A paixão e o orgulho ao ver uma coisa concluída, em fazer parte de um time de estrelas. Acredito que era isso que ele sempre quis enfatizar.</p>
<p style="text-align: justify;">Normalmente, quando fazemos alguma coisa de valor, seja a mínima possível, gostamos sempre de receber um parabéns, nem que seja um simples tapinha nas costas seguido de um “<em>bom trabalho</em>”. Nesse ponto, não tenho do que critica-lo. Quando Jobs brilhava, seu time pegava carona no seu no seu brilho. Quando um trabalho era bem feito, ele sabia reconhecer o esforço. No texto do Isaacson, ele afirma que Jobs mandou gravar o nome de todos das sua equipe a parte interna do Macintosh, afirmando que aquela era a assinatura do artista.</p>
<p style="text-align: justify;">Em diversos pontos, isso segue com controvérsias. Existem algumas histórias que põe abaixo toda essa afirmação acima. Entre as mais famosas, inclusive contado pelo próprio Woz, foi a redução de uma placa de circuito que Woz fez para Jobs. Jobs levou para a Atari, a empresa que trabalhava na época, e ganhou os méritos e o prêmio em dinheiro devido a esse feito e não contou e também não repassou nada para Woz. Outros histórias, está nas idéias sobre o design dos produtos. Essas reuniões eram constantes que tinha com Ive, porém, em muitas situações, as idéias que Ive tinha Jobs afirmava que eram dele. Não repassava o crédito sobre tais fatores. Muitos vão dizer que era assim que ele era, mas, muita coisa poderia ser feita de forma correta por ele. São pontos que não são importantes, acredito que os devidos méritos poderiam ser dados, já que, os acrescentaria muito para a sua equipe.</p>
<p style="text-align: justify;">Depois do seu diagnóstico do câncer, até o seu tratamento, ficou perceptível a sua doença, principalmente pela rápida perda de peso. Porém, uma coisa de se admirar em pessoas complexas, principalmente em Jobs, é o fato da doença não o deixar-se abalar. Era perceptível que havia alguma coisa errada. Porém, poucas vezes se deixou abalar. Em suas apresentação, apesar da perceptível perda de peso, ele nunca expôs seus problemas de saúde a público. Até o ultimo momento que suas forças permitissem ele trabalhou. Se a empresa que ele criou é dessa forma, acredito que seja por essa força que foi reerguida está onde está. A cara da Apple e Pixar está um Jobs, carrancudo, mal criado, agressivo, astuto e falastrão, mas funcionou (It’s work).</p>
<p style="text-align: justify;">Só mais uma coisa (<em>Just one more thing</em>). O fato da teimosia de prevalecer o controle e da convergência de hardware e software o levou a batalhas estremas. No início da Apple, ele levou isso até o seu limite. Após a fundação da NeXT, seu lema continuou. Quando voltou para a Apple, levou isso com sangue. Ao olhar para trás, quando o mundo corria para a liberdade do software para ambientes padronizados e sem controle, Jobs acreditava que o controle estava na convergência do hardware com o software. Vendeu poucos produtos e perdeu mercado, porém, seus produtos funcionavam e bem. Utilizar a convergência, ter o controle do início ao fim da experiência do usuário no uso do computador deu certo para Jobs. Nos últimos dias de sua vida até Bil Gates reconheceu seus feitos, porém, afirmou que isso tudo funcionava apenas com Jobs. Jobs discordou. Mas na minha opinião, Gates estava certo. Acho que poucos teriam a teimosia de manter esse pontos integrados com tanto vigor.</p>
<p style="text-align: justify;">A informática é  uma ciência ainda jovem. Vemos seus protagonistas irem embora a cada ano que passa. Pessoas boas, como Dennis Ritchie, acredito eu como principal colaborador dessa ciência. Porém, temos que dar méritos também a esse louco. Criar produtos, cujo termo mais propício para descreve-los seria “humanizados”, que eram sucesso a cada lançamento não são feito por pessoas comuns. Não que eu diga que Jobs era uma pessoas diferente de nós, mas o que nos difere de pessoas como essas é que a paixão estava nas coisas que ele fazia. A vontade de mudar o mundo “Pensando Diferente” são pontos de méritos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/24/steve-jobs-por-walter-isaacson-uma-simples-opiniao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss 7 &#8211; Reformulação completa</title>
		<link>http://www.nelsonalone.com.br/2012/01/22/jboss-7-reformulacao-completa/</link>
		<comments>http://www.nelsonalone.com.br/2012/01/22/jboss-7-reformulacao-completa/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 20:58:10 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jboss]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=602</guid>
		<description><![CDATA[Quando se trata de servidores de aplicação, é difícil deixar de fora da conversa o JBoss. Sem dúvida, o servidor de aplicação mais conhecido no mundo Java. Recentemente, foi disponibilizada a relase 2 do versão 7 do AS, porem, a questão a ser tratada é a reformulação da estrutura do produto em comparação com as<a href="http://www.nelsonalone.com.br/2012/01/22/jboss-7-reformulacao-completa/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Quando se trata de servidores de aplicação, é difícil deixar de fora da conversa o JBoss. Sem dúvida, o servidor de aplicação mais conhecido no mundo Java.</p>
<p style="text-align: justify;">Recentemente, foi disponibilizada a relase 2 do versão 7 do AS, porem, a questão a ser tratada é a reformulação da estrutura do produto em comparação com as versões anteriores. O time de desenvolvimento praticamente refez todo o core do servidor, modificando desde a estrutura de carregamento das classes (classe loadin) até a forma de gerenciamento de dependência.</p>
<p style="text-align: justify;">A interface de administração, apesar de não ser o forte deles, está mais limpa e direta. Através dele é possível ter total informação do que está instalado no servidor, datasources, módulos, dependências,  web services, etc. Lembro que no JBoss 5/6 havia uma interface que mostrava os webservices que estavam disponíveis na aplicação. Nessa versão, esse tipo de informação está disponível na própria interface de administração.</p>
<p style="text-align: justify;">
<h4 style="text-align: justify;">- VELOCIDADE AO SUBIR</h4>
<p style="text-align: justify;">Alguns pontos que se destacaram logo a primeira vista, entre esses, o mais perceptível é a velocidade que o JBoss é iniciado. Ao verificar os detalhes, me deparei na principal mudança ocorrida no núcleo do servidor. Ele está trabalhando inteiramente com OSGI, ou seja, no momento do boot o servidor sobe apenas os módulos necessários para tal. Esses elementos são lidos no arquivo de configuração domain.xml ou standalone.xml respectivamente.</p>
<p style="text-align: justify;">Isso justifica o fator da velocidade de carregamento. Porém, quando for necessário incluir mais um módulo que sua aplicação necessite, um REST ou um Web Service tradicional por exemplo, será necessário editar o arquivo de configuração para que o módulo seja incluso.</p>
<p style="text-align: justify;">
<h4 style="text-align: justify;">- OS MÓDULOS</h4>
<p style="text-align: justify;">Essa informação está bem explícitas nos arquivos de configuração das instâncias, logo na primeira sessão está presente as extensões necessárias para o funcionamento da instância. Mais embaixo, quase no fim do documento, estão os módulos.</p>
<p style="text-align: justify;">Os drivers de conexão JDBC são também tratados como módulos. Portanto, para utilizar um driver de conexão com um determinado banco de dados, será necessário incluí-lo como um módulo e importa-lo do projeto. Isso é feito criando uma hierarquia de diretórios, adicionar o jar do driver no diretório main, conforme o padrão, e criar um documento de descrição do módulo em questão, como o exemplo abaixo:</p>
<p style="text-align: justify;"><a href="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/01/Captura-de-Tela-2012-01-22-às-15.53.35.png"><img class="size-medium wp-image-604 aligncenter" title="Captura de Tela 2012-01-22 às 15.53.35" src="http://www.nelsonalone.com.br/content/wp-content/uploads/2012/01/Captura-de-Tela-2012-01-22-às-15.53.35-300x190.png" alt="" width="300" height="190" /></a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<h4 style="text-align: justify;">- INSTÂNCIA</h4>
<p style="text-align: justify;">A versão 7 suporta uma característica muito útil que para organizar as aplicações. O conceito de instância. Quem já trabalhou com o Oralce Application Server (hoje em dia Web Ligic) e com o WebSphere sentia bastante falta desse conceito no JBoss para efetuar configurações específicas de uma aplicação específica.</p>
<p style="text-align: justify;">No primeiro momento, a opção por executar o jboss no modo standalone, mesmo em ambiente de produção, torna-se a melhor opção pelo fato da facilidade, ou melhor, ser um processo parecido como o que tinha nas versões anteriores.  Isso não quer dizer que não funcione, pelo contrário, funciona perfeitamente, tanto que temos aplicações rodando com essa configuração.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">Acredito que, além da quantidade de recursos existentes nessa nova versão, uma outra característica que vem implícita com o servidor de aplicação, mesmo nas versões anteriores, é a simplicidade. A curva de aprendizado para configurar e disponibilizar um servidor de aplicação JBoss é bem baixa.</p>
<p style="text-align: justify;">O JBoss apresentou um servidor de aplicação robusto e simples de utilizar. Acredito que com essa ultima versão deixou muito dos seus usuários otimistas, mesmo com as mudanças drásticas realizadas em sua estrutura.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2012/01/22/jboss-7-reformulacao-completa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Storm no GitHub</title>
		<link>http://www.nelsonalone.com.br/2011/09/26/twitter-storm-no-github/</link>
		<comments>http://www.nelsonalone.com.br/2011/09/26/twitter-storm-no-github/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 15:08:18 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[storm]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=595</guid>
		<description><![CDATA[A equipe de desenvolvimento do Twitter disponibilizou nessa segunda a ultima versão do storm. Pra quem não conhece, assim como eu a duas horas atrás, é uma API do Twitter, desenvolvida pela BackType, utilizada para solucionar problemas de processamento em tempo real com tolerância a falhas. Referências abaixo: Artigo na Infoq: Link Repositório no GitHub:<a href="http://www.nelsonalone.com.br/2011/09/26/twitter-storm-no-github/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A equipe de desenvolvimento do Twitter disponibilizou nessa segunda a ultima versão do storm. Pra quem não conhece, assim como eu a duas horas atrás, é uma API do Twitter, desenvolvida pela BackType, utilizada para solucionar problemas de processamento em tempo real com tolerância a falhas.</p>
<p style="text-align: justify;">Referências abaixo:</p>
<p style="text-align: justify;">Artigo na Infoq: <a title="infoq" href="http://www.infoq.com/news/2011/09/twitter-storm-real-time-hadoop">Link</a></p>
<p style="text-align: justify;">Repositório no GitHub: <a title="github download" href="https://github.com/nathanmarz/storm/downloads">Link</a></p>
<p style="text-align: justify;">Wiki: <a title="wiki github" href="https://github.com/nathanmarz/storm/wiki">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2011/09/26/twitter-storm-no-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Código do Quake II</title>
		<link>http://www.nelsonalone.com.br/2011/09/22/codigo-do-quake-ii/</link>
		<comments>http://www.nelsonalone.com.br/2011/09/22/codigo-do-quake-ii/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 17:17:29 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[games]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[quake]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=592</guid>
		<description><![CDATA[A +- um ano atrás resolvi me aventurar no código do Quake III. Tentei reencarnar meus conhecimentos, não muito sólidos,  em C/C++ para tentar aprender um pouco sobre motores de games. Pelo fato do código fonte dos Quake I, II e III estarem disponíveis no site da ID, o único trabalho que tive foi de<a href="http://www.nelsonalone.com.br/2011/09/22/codigo-do-quake-ii/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">A +- um ano atrás resolvi me aventurar no <a title="Post sobre o protocolo multiplayer do quake 3" href="http://www.nelsonalone.com.br/2009/10/24/saga-quake-engine/">código do Quake III</a>. Tentei reencarnar meus conhecimentos, não muito sólidos,  em C/C++ para tentar aprender um pouco sobre motores de games. Pelo fato do código fonte dos Quake I, II e III estarem disponíveis no site da ID, o único trabalho que tive foi de fazer o download dos fontes e abrir no visual Studio 2008 e configurar os módulos para abrir na IDE. Fiz compilar e rodar o game para depuração, olha que deu um trabalhão, mexi em muitas linhas, adicionei outras, mas nada de especial, alem do mais, estava de férias e isso acaba rápido. Apesar do código estar bem arrumado, fácil de ler e bem intuitivo, não consegui tempo pra fuçar mais coisa nos fontes.</p>
<p style="text-align: justify;">Fuçando na internet, encontrei o blog do <a href="http://fabiensanglard.net/quake2/index.php">Fabien Sanglard&#8217;s</a> que transcreve todos os passos para rodar os fontes do Quake II. Em seu <a href="http://fabiensanglard.net/quake2/index.php">post</a> são descrito os passos necessários para compilar e executar os fontes, contem também os detalhes do módulos, arquitetura e etc. O post está mais completo que o meu sobre o Quake III. Vale a pena dar uma olhada.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2011/09/22/codigo-do-quake-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate/JPA – Utilizando SQL sem perder o vinculo dos objetos relacionados</title>
		<link>http://www.nelsonalone.com.br/2011/09/22/hibernatejpa-%e2%80%93-utilizando-sql-sem-perder-o-vinculo-dos-objetos-relacionados/</link>
		<comments>http://www.nelsonalone.com.br/2011/09/22/hibernatejpa-%e2%80%93-utilizando-sql-sem-perder-o-vinculo-dos-objetos-relacionados/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 16:51:37 +0000</pubDate>
		<dc:creator>nelsonsozinho</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Persistência]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>

		<guid isPermaLink="false">http://www.nelsonalone.com.br/?p=581</guid>
		<description><![CDATA[Não há dúvidas de que o hibernate é um excelente ORM, se não o melhor que há no mercado. Porém, muitas pessoas, satisfeitas com os procedimentos iniciais de aprendizado do framework, não se dão conta das demais funcionalidades disponíveis para o desenvolvedor. A lista é vasta, confesso que posso não conhecer a metade, mas alguns<a href="http://www.nelsonalone.com.br/2011/09/22/hibernatejpa-%e2%80%93-utilizando-sql-sem-perder-o-vinculo-dos-objetos-relacionados/"> <br /><br /> (More)…</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Não há dúvidas de que o hibernate é um excelente ORM, se não o melhor que há no mercado. Porém, muitas pessoas, satisfeitas com os procedimentos iniciais de aprendizado do framework, não se dão conta das demais funcionalidades disponíveis para o desenvolvedor. A lista é vasta, confesso que posso não conhecer a metade, mas alguns dias atrás, uma dessas funcionalidades me ajudou muito.</p>
<p style="text-align: justify;">Um objeto persistente, para o hibernate, é uma entidade que contem relacionamentos com outras entidades que juntos formam uma relação. Em diversas situações, na maioria das vezes no mundo real, essa relação se torna complexa quando existe a necessidade de relação com outras entidades, somado com o numero enorme de dados relacionados. Existem várias formas de obter essas esses dados relacionados, uns que permitem obter todo o conjunto de dados relacionados ao carregar o objeto (eager), outro no momento que a relação é obtida (lazy). Outras alternativas podem ser utilizadas em conjunto, como, as consultas nomeadas atreladas ao carregamento do objeto. Porém, apenas obter a lista de desses informações não é suficiente para a aplicação, fazendo com que o desenvolvedor utiliza consultas mais elaboradas com HQL ou criteria.</p>
<p style="text-align: justify;">A forma como o framework monta as consultas é na maioria das vezes genérica e pouco intuitiva, fazendo com que o desenvolvedor opte por utilizar o SQL nativo, ou portar a consulta para uma Stored Procedure para construir uma consulta mais elaborada. É uma estratégia plausível quando a aplicação necessita de desempenho mas, isso tiraria a principal vantagem do framework; o acesso as relações que são representadas pelo relacionamento entre os objetos. Existe uma maneira muito simples de executar uma consulta SQL mantendo o relacionamento entre os objetos.</p>
<p style="text-align: justify;">Para o framework, os objetos persistentes são de extrema importância. Quando o framework é executado pela primeira vez, ele adiciona uma série de funcionalidade nos objetos persistentes que permite realizar as operações em suas relações. A maneira com que o framework realiza essa tarefa é pela <a title="Instrumentação de cógigo - Wikipedia" href="http://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29">Instrumentação</a> de código. A instrumentação nada mais de uma técnica de incluir alterações do código do programa mesmo após a sua compilação. O conceito pode ser semelhante com Reflexão e AOP, mas existem particularidades que tornam os conceitos bem distintos. Por ser um assunto muito pesquisado e com referencias em abundância, é um assunto para ser tratado outra hora. No hibernate, isso é feito através da lib ASM, que é um extenso conjunto de utilidade que permitem a plicar esse conceito nas classes escritas em linhagem Java.</p>
<p>Bom, para que o framework compreenda que o resultado de uma consulta SQL possa ser vinculado a um objeto é necessário que o retorno corresponda aos atributos do objeto, sendo que o objeto possa ser reconhcido pelo motor de consulta. Ex:<code></code></p>
<p><code><br />
List&lt;ClasseQualquer&gt; planos = new ArrayList&lt;ClasseQualquer&gt;();<br />
String queryStr = queryUtils.findValue(nome_da_query); //obtem a string de consulta<br />
Query query = entityManager.createNativeQuery(queryStr, ClasseQualquer.class);</code></p>
<p>&nbsp;</p>
<p>Obtendo um objeto Query configurado como acima, é possível realizar operações como essas abaixo:<code><br />
</code></p>
<p><code>List dados = instanciaObjetoQualquer.getDadosParticulares();</code></p>
<p>&nbsp;</p>
<p>Esse simples macete pode ajudar bastente para obter objetos, que necessitem manter o acesso aos objetos relacionados, através de consultas bem elaboradas e com o desempenho do SQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nelsonalone.com.br/2011/09/22/hibernatejpa-%e2%80%93-utilizando-sql-sem-perder-o-vinculo-dos-objetos-relacionados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

