<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7359688639119059273</id><updated>2024-10-03T17:34:52.284-03:00</updated><category term="scala"/><category term="design patterns"/><category term="functional programming"/><category term="groovy"/><category term="ExpandoMetaClass"/><category term="Hibernate"/><category term="JPA"/><category term="JTA"/><category term="Java"/><category term="Maven"/><category term="Spring"/><category term="Threads"/><category term="Transaction"/><category term="Transação"/><category term="chrome"/><category term="composição"/><category term="decorator"/><category term="desenvolvimento de software"/><category term="flash"/><category term="google"/><category term="grails"/><category term="herança"/><category term="invokeMethod"/><category term="jboss"/><category term="linux"/><category term="metaClass"/><category term="mplayer plugin"/><category term="placehoder"/><category term="plugins"/><category term="trait"/><category term="uninstall"/><title type='text'>CODEPLACE</title><subtitle type='html'>Let&#39;s code better?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-3993456083402585772</id><published>2010-01-18T13:36:00.004-02:00</published><updated>2010-01-18T13:44:29.171-02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grails"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="plugins"/><category scheme="http://www.blogger.com/atom/ns#" term="uninstall"/><title type='text'>Uninstall de plugins no grails</title><content type='html'>Dica rápida, e simples mas que é um pouco difícil de achar na documentação do Grails.&lt;br/&gt;
Para se instalar um plugin é muito fácil, você simplesmente roda o comando grails install-plugin *nome do plugin*.&lt;br/&gt;
Mas e para remover o plugin?&lt;br/&gt;
Não temos um comando grails uninstall-plugin.&lt;br/&gt;
Mas não há motivo para revolta, remover um plugin é bem simples.&lt;br/&gt;
Antes de instalar um plugin conheça o seu arquivo application.properties, nele são listados todos os plugins que você vier a instalar.&lt;br/&gt;
Quando um plugin é instalado lá ele é listado assim como os plugins que são dependências dele.&lt;br/&gt;
Para remover um plugin não mais utilizado no seu projeto simplesmente delete a linha com o mesmo nesse arquivo, ao rodar o build do seu projeto o console irá perguntar se você quer remover o plugin. &lt;br/&gt;
Pronto =)&lt;br/&gt;
Espero ter ajudado alguém com essa dica.&lt;br/&gt;
&lt;br/&gt;
See you and Let&#39;s Code Better people.</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/3993456083402585772/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/3993456083402585772' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/3993456083402585772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/3993456083402585772'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2010/01/uninstall-de-plugins-no-grails.html' title='Uninstall de plugins no grails'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-4826405222710381366</id><published>2009-09-16T01:16:00.009-03:00</published><updated>2009-09-16T01:29:19.116-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="composição"/><category scheme="http://www.blogger.com/atom/ns#" term="decorator"/><category scheme="http://www.blogger.com/atom/ns#" term="design patterns"/><category scheme="http://www.blogger.com/atom/ns#" term="herança"/><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><category scheme="http://www.blogger.com/atom/ns#" term="trait"/><title type='text'>Decorando objetos em Scala</title><content type='html'>&lt;p&gt;No desenvolvimento de software sempre existem características que são ortogonais ao sistema.&lt;/p&gt;
&lt;p&gt;Para remover a duplicação de código que tais características causam podemos
utilizar interceptors, aspectos, proxies, etc para com isso decorarmos o nosso
objeto com a funcionalidade que queremos.&lt;/p&gt;
&lt;p&gt;A solução fica legal, mas a quantidade de código que precisa ser gerada às vezes poderia
desencorajar a implementação pois a duplicação de código seria trocada em alguns casos por
muito código.&lt;/p&gt;
&lt;p&gt;Entretanto se você resolver desenvolver seu sistema em Scala uma solução muito mais simples
poderá ser implementada.&lt;/p&gt;
&lt;p&gt;Com a utilização de traits, você pode adicionar novas características a objetos com muita
facilidade e pouco código.&lt;/p&gt;
&lt;p&gt;Por exemplo, suponhamos que você queira realizar um profile de alguns objetos no seu sistema.&lt;/p&gt;
&lt;p&gt;O seguinte código resolveria tal problema:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
  //classe que já possuo
  class T{
    def f = print(&quot;Ola enfermeira!&quot;)
  }
  //trait que adiciona comportamento a interface de T
  trait Profile extends T{
    abstract override def f = {
      val time = System.nanoTime()
      super.f
      println(&quot;Tempo total em nanos: &quot; + (System.nanoTime() - time))
    }
  } 
&lt;/pre&gt;
&lt;p&gt;Ao rodar o seguinte código:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
  val t = new T with Profile
  t.f
&lt;/pre&gt;
&lt;p&gt;Obtemos o seguinte resultado: Ola enfermeira!Tempo total em nanos: 214972&lt;/p&gt;
&lt;p&gt;O que acontece é que utilizando a palava with na declaração da variável eu estou
dizendo ao compilador do scala que ele deve adicionar as caracteristicas na minha Trait
Profile ao objeto.&lt;/p&gt;
&lt;p&gt;Sim, isso é um tipo de herança&lt;/p&gt;
&lt;p&gt;Logo quando eu chamo o método f, a implementação que é chamada é a da
Trait e não do objeto T.&lt;/p&gt;
&lt;p&gt;Nesse ponto um detalhe que precisamos notar é como o scala trata o super.&lt;/p&gt;
&lt;p&gt;Quando chamamos o super dentro da implementação de f em T o método f chamado será o da
implementação que está imediatamente a esquerda da definição da trait.&lt;/p&gt;
&lt;p&gt;Ou seja, o seguinte código pode ser feito:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
  trait Smile extends T{
    abstract override def f = {
      print(&quot;=)&quot;)
      super.f
    }
  }

  val t = new T with Profile with Smile
  t.f
&lt;/pre&gt;
&lt;p&gt;Tendo como output: =)Ola enfermeira!Tempo total em nanos: 27238&lt;/p&gt;
&lt;p&gt;A implementação que está mais a direita (no caso Smile) foi invocada.&lt;/p&gt;
Ao chamar super a implementação exatamente a esquerda foi chamada (Profile).&lt;/p&gt;
&lt;p&gt;No próximo super a implementação de T foi chamada.&lt;/p&gt;
&lt;p&gt;Com tal forma de encadeamento seus objetos podem ser decorados de inúmeras formas.&lt;/p&gt;
&lt;p&gt;Tem alguma idéia melhor de como criar tais características?&lt;/p&gt;
&lt;p&gt;Coloque nas revisões desse post =)&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/4826405222710381366/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/4826405222710381366' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/4826405222710381366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/4826405222710381366'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/09/decorando-objetos-em-scala.html' title='Decorando objetos em Scala'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-1050844486223586806</id><published>2009-09-10T10:35:00.008-03:00</published><updated>2009-09-16T01:30:03.296-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="design patterns"/><category scheme="http://www.blogger.com/atom/ns#" term="functional programming"/><category scheme="http://www.blogger.com/atom/ns#" term="placehoder"/><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><title type='text'>Eliminando ifs encadeados com scala.</title><content type='html'>&lt;p&gt;Estava lendo o seguinte &lt;a href=&quot;http://www.eliezer.com.br/post/sabe-aquele-monte-de-if-e-else-no-codigo-limpando-tudo-em-java/&quot;&gt;post&lt;/a&gt; do meu amigo eliezer sobre eliminar if encadeados e pensei: Como seria um código para resolver esse problema em Scala.&lt;/p&gt;
&lt;p&gt;
Utilizando firstClass functions e placehoder syntax criei o seguinte código:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
object StringUtils {                                                   
  def format( action: String =&gt; String, value: String ) = action(value)
  def removeBlanks = { (_:String).replaceAll( &quot; &quot;, &quot;&quot;) }                       
  def onlyNumbers = { (_:String).replaceAll( &quot;\\D&quot;, &quot;&quot; ) }             
}
&lt;/pre&gt;
&lt;p&gt;
Dá pra ver que o código fica bem mais enxuto e a responsabilidade fica toda dentro do objeto singleton StringUtils.
O código cliente fica bem interessante também:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
StringUtils.format( StringUtils.removeBlanks, &quot;Ola enfermeira&quot; )
&lt;/pre&gt;
&lt;p&gt;
O código retorna Olaenfermeira
&lt;/p&gt;
&lt;p&gt;
Legal né =)
&lt;/p&gt;
&lt;p&gt;
Se você tem alguma idéia melhor por favor compartilhe ela aí embaixo.
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/1050844486223586806/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/1050844486223586806' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/1050844486223586806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/1050844486223586806'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/09/eliminando-ifs-encadeados-com-scala.html' title='Eliminando ifs encadeados com scala.'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-5928391178682776149</id><published>2009-09-03T01:36:00.007-03:00</published><updated>2009-09-10T13:16:53.829-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="functional programming"/><category scheme="http://www.blogger.com/atom/ns#" term="scala"/><title type='text'>Scala e o jeito funcional de programar</title><content type='html'>&lt;p&gt;Ao programar por muitos anos com linguagens como C e Java nós nos acostumamos demais com o modo imperativo de programação.
Fazendo isso esquecemos algumas vantagens que o paradigma funcional pode nos trazer.
&lt;/p&gt;
&lt;p&gt;
Ultimamente estou estudando Scala, e apesar da linguagem permitir que você construa código imperativo, a mesma traz interessantes construções que nos incentivam a usar o paradigma funcional.
&lt;/p&gt;
&lt;p&gt;
Um exemplo simples mas que mostra esse conceito seria um código para varrer os parâmetros de entrada de um programa e simplesmente imprimi-los na tela.
&lt;/p&gt;
&lt;p&gt;
Um código imperativo em Scala seria assim: 
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
var i=0
while(i &lt; args.length){
  println(args(i))
  i += 1
}
&lt;/pre&gt;
&lt;p&gt;
Como podemos ver, nada muito complexo, simplesmente um laço que varre a lista imprimindo seus elementos.
&lt;/p&gt;
&lt;p&gt;
Utilizando um pouco do paradigma funcional presente em Scala o mesmo código poderia ser feito da seguinte maneira:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
args.foreach(arg =&gt; println(arg))
&lt;/pre&gt;
&lt;p&gt;
O seguinte código define um &lt;span style=&quot;font-style:italic;&quot;&gt;function literal&lt;/span&gt;. Esta função recebe como parâmetro um item da lista de argumentos e imprime o mesmo, o processo é repetido para cada argumento da lista.
&lt;/p&gt;
&lt;p&gt;
Da mesma maneira que foi chamado um println, qualquer função poderia ter sido chamada sobre a iteração.
&lt;/p&gt;
&lt;p&gt;
É importante notar que o código acima é facilmente implementado em Java, basta pensarmos de maneira mais funcional.
&lt;/p&gt;
&lt;p&gt;
Entretanto, como o valor extraído da lista é o único parâmetro para a função que será executada, é possível fazer com que esse código seja ainda mais simples:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
args.foreach(println)
&lt;/pre&gt;
&lt;p&gt;
E você achando que o laço no início do post que era simples ein =)
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/5928391178682776149/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/5928391178682776149' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/5928391178682776149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/5928391178682776149'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/09/scala-e-o-jeito-funcional-de-programar.html' title='Scala e o jeito funcional de programar'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-4733173816081594995</id><published>2009-08-27T21:19:00.007-03:00</published><updated>2009-08-27T23:00:59.708-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="desenvolvimento de software"/><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><title type='text'>Múltiplas instâncias do JBoss na mesma máquina.</title><content type='html'>&lt;p&gt;Esta é uma dica simples porém muito útil.&lt;/p&gt;
&lt;p&gt;
Se você estiver desenvolvendo utilizando o JBossAS e precisar, por algum motivo, 
executar mais de uma instância na mesma máquina para testes, existe uma maneira muito fácil de fazer isso.
&lt;/p&gt;

&lt;p&gt;
No diretório $JBOSS_HOME/server duplique o perfil que você quer subir duas vezes:
&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
   cp -rf default node1
   cp -rf default node2
&lt;/pre&gt;

&lt;p&gt;
Em seguida ajuste o range de portas para que as duas instancias subam sem conflitos.
&lt;/p&gt;
&lt;p&gt;
Mas como assim ajustar o range de portas? você está dizendo que vou ter que alterar uma por uma?
&lt;/p&gt;
&lt;p&gt;
É aí que o JBoss mostra que é um application server bem configurado =).&lt;/br&gt;
&lt;/p&gt;

&lt;p&gt;
No arquivo &lt;strong&gt;jboss-service.xml&lt;/strong&gt; dentro do diretório conf de cada profile existe uma tag comentada que já configura todo o range de portas de um perfil automaticamente.&lt;/p&gt;

&lt;p&gt;
Neste arquivo busque pela seguinte tag:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
   &lt;mbean code=&quot;org.jboss.services.binding.ServiceBindingManager&quot;
     name=&quot;jboss.system:service=ServiceBindingManager&quot;&gt;
     &lt;attribute name=&quot;ServerName&quot;&gt;ports-01&lt;/attribute&gt;
     &lt;attribute name=&quot;StoreURL&quot;&gt;${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml&lt;/attribute&gt;
     &lt;attribute name=&quot;StoreFactoryClassName&quot;&gt;
       org.jboss.services.binding.XMLServicesStoreFactory
     &lt;/attribute&gt;
   &lt;/mbean&gt;
&lt;/pre&gt;
&lt;p&gt;
Descomente-a. Ao fazer isso o perfil em questão irá usar o range de ports-01. Já existem também pré configurados o ranges ports-02 e ports-03.
&lt;/p&gt;
&lt;p&gt;
Com tal configuração todas as portas do perfil alterado serão somadas em 100
&lt;/p&gt;
&lt;p&gt;
Por exemplo, para acessar o jmx console ao invéz de usarmos a url &lt;strong&gt;http://localhost:8080/jmx-console&lt;/strong&gt; usaremos &lt;strong&gt;http://localhost:8180/jmx-console&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
Tal regra serve para todas as portas como as de ejb ou jndi.
&lt;/p&gt;
&lt;p&gt;
No range o ports-02 o valor somado é 200 e o ports-03 é 300.
&lt;/p&gt;
&lt;p&gt;
Agora que você modificou uma das instâncias pra usar um novo range de portas basta subí-las:
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;
   $JBOSS_HOME/bin/run.sh -c node1
   $JBOSS_HOME/bin/run.sh -c node2
&lt;/pre&gt;
&lt;p&gt;
Caso você ainda precise de mais perfis rodando ao mesmo tempo uma alternativa é o uso de ips virtuais na máquina.
&lt;/p&gt;
&lt;p&gt;
Assim cada instancia dê um bind em um ip diferente (usando o parametro -b no run.sh).
&lt;/p&gt;
&lt;p&gt;
Existe também a possibilidade de serem criados mais ranges de porta. 
Simplesmente os adicione no arquivo &lt;strong&gt;sample-bindings.xml&lt;/strong&gt; listado no trecho xml acima. 
&lt;/p&gt;

&lt;p&gt;
Espero ter te ajudado com a dica. =)
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/4733173816081594995/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/4733173816081594995' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/4733173816081594995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/4733173816081594995'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/08/multiplas-instancias-do-jboss-na-mesma.html' title='Múltiplas instâncias do JBoss na mesma máquina.'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-675146910579872811</id><published>2009-07-22T12:40:00.009-03:00</published><updated>2009-08-27T23:00:33.626-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chrome"/><category scheme="http://www.blogger.com/atom/ns#" term="flash"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="mplayer plugin"/><title type='text'>Plugins no chrome para linux</title><content type='html'>Uso o firefox diariamente para desenvolvimento muito em parte por conta de suas extensões que facilitam o meu trabalho.&lt;br/&gt;
Entretanto a sua lentidão me incomoda às vezes.&lt;br/&gt;
Recentemente vi no &lt;a href=&quot;http://blog.chromium.org/&quot;&gt;Chromium Blog&lt;/a&gt; que um release ainda unstable estava disponível para o linux (este já empacotado para o ubuntu, com atualizações, sem dor de cabeça).&lt;br/&gt; 
Como gosto muito de testar novidades resolvi instalá-lo.&lt;br/&gt; 
Você pode fazer o mesmo indo na página do download &lt;a href=&quot;http://dev.chromium.org/getting-involved/dev-channel&quot;&gt;aqui&lt;/a&gt;.&lt;br/&gt;
Ao começar a usá-lo é notório que falta muita coisa a ser feita, mas fica evidente a velocidade e a estabilidade do navegador.&lt;br/&gt;
Depois de pouco tempo comecei a usá-lo como navegador do dia dia (não o de desenvolvimento) por conta de sua velocidade.&lt;br/&gt; 
Entretanto o pacote não vem com plugins como o do flash ativados.&lt;br/&gt;
Olhando pela web vi esse &lt;a href=&quot;http://jeanderuelle.blogspot.com/2009/07/enable-flash-on-google-chrome-linux-dev.html#comment-form&quot;&gt;post&lt;/a&gt; e resolvi testar.&lt;/br&gt;
O plugin do flash funciona perfeitamente.&lt;br/&gt; 
Testei os plugins do mplayer e obtive total sucesso.&lt;br/&gt;
Basta criar um diretorio:&lt;br/&gt;&lt;br/&gt; 
/opt/google/chrome/plugins&lt;br&gt; nele colocar os .so do flash e mplayer.&lt;/br&gt;
Após isso o chome deve ser iniciado da seguinte forma:&lt;br/&gt;
&lt;br/&gt;
/opt/google/chrome/google-chrome --enable-plugins&lt;br/&gt;&lt;br/&gt;

O próximo passo é aprender sobre as ferramentas de desenvolvimento dele e fazer meus próprios plugins aí talvez eu esqueça o firefox&lt;br/&gt;&lt;br/&gt;

Alguém consegue rodar mais algum plugin? Se sim comente aí em baixo =)&lt;br/&gt;&lt;br/&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/675146910579872811/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/675146910579872811' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/675146910579872811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/675146910579872811'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/07/plugins-no-chrome-para-linux.html' title='Plugins no chrome para linux'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-3620737140064531673</id><published>2009-03-16T22:43:00.013-03:00</published><updated>2009-08-27T22:37:18.637-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ExpandoMetaClass"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="invokeMethod"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="metaClass"/><category scheme="http://www.blogger.com/atom/ns#" term="Threads"/><title type='text'>Groovy e a magia do invokeMethod</title><content type='html'>Estava eu discutindo com meu amigo &lt;a href=&quot;http://andrerigon.wordpress.com/&quot;&gt; André Ribeiro Gonçalves &lt;/a&gt; sobre o Groovy e sua simplicidade.&lt;br/&gt;
&lt;br/&gt;

Durante a discussão começamos a trocar idéias sobre um recurso muito interessante da linguagem:&lt;br/&gt;
A possibilidade de interceptar a chamada de um método não existente de um objeto e fazer com que o mesmo faça algo de útil.&lt;br/&gt;
Como nós dois adoramos programação concorrente, o primeiro exemplo que nos veio a mente foi o de passar o processamento de um método de síncrono para assíncrono utilizando apenas convenção de código, escondendo assim a criação de um Runnable para encapsular o método e tornando isso algo mais transparente.&lt;br/&gt;
Ao final da discução o seguinte código foi criado, o mesmo é bem simples e é somente uma prova de conceito, mas é excelente pra mostrar a idéia.&lt;br/&gt;
E vocês, também acham isso fascinante?&lt;br/&gt;

&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;
   class A {

    def b( String name ){
        for( int i=0; i&lt;15; i++ )
            println( name + i ) 
    }

    def invokeMethod( String name, args ){
        if( name.endsWith(&quot;Async&quot;) ){
            name = name.substring( 0, name.size()-5 );
            def m = A.metaClass.getMetaMethod(name, args)
            if( m == null ){
                println( &quot;1. Nothing to do! No method definition found!&quot; )
                return
            }
            def t = { 
                println( &quot;Invoking $name in asyn way&quot; )
                m.invoke(this,args)
            } as Runnable
            def t1 = new Thread(t)
            t1.start()
        }
        else {
           println( &quot;2. Nothing to do! No method definition found!&quot; )
        }
    }


}

def a = new A()

a.Async(&quot;t1&quot;)
a.c()
a.cAsync(&quot;t2&quot;)
a.b(&quot;name&quot;)
a.bAsync(&quot;t3&quot;)
a.bAsync(&quot;t4&quot;)
a.bAsync(&quot;t5&quot;)
a.bAsync(&quot;t6&quot;)
a.bAsync(&quot;t7&quot;)
a.bAsync(&quot;t8&quot;)
a.bAsync(&quot;t9&quot;)
a.bAsync(&quot;t10&quot;)
a.bAsync(&quot;t11&quot;)
a.bAsync(&quot;t12&quot;)
a.bAsync(&quot;t13&quot;)
a.bAsync(&quot;t14&quot;)
a.bAsync(&quot;t15&quot;)
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/3620737140064531673/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/3620737140064531673' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/3620737140064531673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/3620737140064531673'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2009/03/groovy-e-magia-do-invokemethod.html' title='Groovy e a magia do invokeMethod'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-7594720686246691882</id><published>2008-06-22T21:40:00.071-03:00</published><updated>2009-03-02T10:16:38.844-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="JPA"/><category scheme="http://www.blogger.com/atom/ns#" term="JTA"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><category scheme="http://www.blogger.com/atom/ns#" term="Transaction"/><category scheme="http://www.blogger.com/atom/ns#" term="Transação"/><title type='text'>Controle de Transação com Spring, JTA, JPA, Hibernate e Maven</title><content type='html'>Com o crescimento das aplicações que vêm sendo desenvolvidas um dos maiores problemas na estruturação de um projeto reside no controle de transações.
Quando vários datasources entram na história o problema só aumenta.
Segue abaixo uma proposta de solução para o controle de transação utilizando String, com JTA e Maven. As configurações abaixo necessitam de um container J2EE para funcionarem, o exemplo foi testado no JBoss 4.0.5ga.
Com o uso do Spring o controle transacional se torna transparente, sendo então o problema resolvido. Segue tutorial abaixo:

&lt;h2&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Configurações do Maven&lt;/span&gt;&lt;/h2&gt;  &lt;p&gt;A configuração do Maven para o uso de tais ferramentas é simples.&lt;/p&gt;  &lt;p&gt;Somente são necessárias algumas dependências e um repositório para busca-las.&lt;/p&gt;  &lt;a name=&quot;Adicionando_dependências&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Adicionando dependências&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;O seguinte trexo deve ser adicionado nas dependências do projeto no seu arquivo pom.xml.&lt;/p&gt; 



&lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;spring-orm&amp;lt;/artifactId&gt;
&amp;lt;version&gt;2.5.4&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;spring-aop&amp;lt;/artifactId&gt;
&amp;lt;version&gt;2.5.4&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;spring-context&amp;lt;/artifactId&gt;
&amp;lt;version&gt;2.5.4&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;spring-jdbc&amp;lt;/artifactId&gt;
&amp;lt;version&gt;2.5.4&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.springframework&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;spring-tx&amp;lt;/artifactId&gt;
&amp;lt;version&gt;2.5.4&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.hibernate&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;hibernate-entitymanager&amp;lt;/artifactId&gt;
&amp;lt;version&gt;3.3.1.ga&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;javax.persistence&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;persistence-api&amp;lt;/artifactId&gt;
&amp;lt;version&gt;1.0&amp;lt;/version&gt;
&amp;lt;scope&gt;provided&amp;lt;/scope&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;commons-beanutils&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;commons-beanutils&amp;lt;/artifactId&gt;
&amp;lt;version&gt;1.7.0&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.hibernate&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;hibernate&amp;lt;/artifactId&gt;
&amp;lt;version&gt;3.2.6.ga&amp;lt;/version&gt;
&amp;lt;exclusions&gt;
   &amp;lt;exclusion&gt;
        &amp;lt;groupId&gt;javax.transaction&amp;lt;/groupId&gt; &amp;lt;!-- Exclusion to remove a classloader conflit with jta of JBoss --&gt;
        &amp;lt;artifactId&gt;jta&amp;lt;/artifactId&gt;
   &amp;lt;/exclusion&gt;
&amp;lt;/exclusions&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.hibernate&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;hibernate-annotations&amp;lt;/artifactId&gt;
&amp;lt;version&gt;3.3.1.GA&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&amp;lt;dependency&gt;
&amp;lt;groupId&gt;org.hibernate&amp;lt;/groupId&gt;
&amp;lt;artifactId&gt;hibernate-commons-annotations&amp;lt;/artifactId&gt;
&amp;lt;version&gt;3.3.0.ga&amp;lt;/version&gt;
&amp;lt;/dependency&gt;
&lt;/pre&gt;
&lt;/div&gt;
Aqui estão listados todos os jars necessários para o uso das ferramentas mencionadas neste tutorial.
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;Adicionando_repositório&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Adicionando repositório&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;O seguinte trexo deve ser adicionado nos repositórios do projeto para que todas as dependências sejam satisfeitas.&lt;/p&gt;  &lt;p&gt;Tal repositório contém algumas das dependências do Hibernate.&lt;/p&gt;&lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;repository&gt;
&amp;lt;id&gt;maven-repository.dev.java.net&amp;lt;/id&gt;
&amp;lt;name&gt;Java Dev Net Repository&amp;lt;/name&gt;
&amp;lt;url&gt;http://download.java.net/maven/2/&amp;lt;/url&gt;
&amp;lt;releases&gt;
     &amp;lt;enabled&gt;true&amp;lt;/enabled&gt;
     &amp;lt;updatePolicy&gt;never&amp;lt;/updatePolicy&gt;
&amp;lt;/releases&gt;
&amp;lt;snapshots&gt;
    &amp;lt;enabled&gt;false&amp;lt;/enabled&gt;
&amp;lt;/snapshots&gt;
&amp;lt;/repository&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name=&quot;Utilização_do_Spring&quot;&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Utilização do Spring&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;Com a utilização do Spring podemos injetar o EntityManager do JPA no Dao, utilizando como provider o Hibernate.&lt;/p&gt;  &lt;p&gt;O controle de transação se torna transparente para o desenvolvedor não sendo mais necessário que o mesmo inicie e finalize cada transação.&lt;/p&gt;  &lt;p&gt;Vejamos utilizar o Spring no escopo proposto.&lt;/p&gt;  &lt;a name=&quot;Configuração_do_applicationContext&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Configuração do applicationContext&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;Abaixo segue uma configuração padrão para o applicationContext da aplicação&lt;/p&gt;&lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot;
xmlns:jboss=&quot;http://www.springmodules.org/schema/jboss&quot;
xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd&quot;
default-autowire=&quot;byName&quot;&gt;
&amp;lt;bean id=&quot;dao&quot; scope=&quot;prototype&quot;
class=&quot;br.com.product.project.commons.dao.DaoImpl&quot;&gt;
&amp;lt;/bean&gt;
&amp;lt;bean id=&quot;entityManagerFactory&quot;
class=&quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&quot;&gt;
&amp;lt;property name=&quot;jpaProperties&quot;&gt;
    &amp;lt;props&gt;
         &amp;lt;prop key=&quot;hibernate.transaction.factory_class&quot;&gt;org.hibernate.transaction.JTATransactionFactory
         &amp;lt;/prop&gt;
         &amp;lt;prop key=&quot;hibernate.transaction.manager_lookup_class&quot;&gt;org.hibernate.transaction.JBossTransactionManagerLookup
         &amp;lt;/prop&gt;
    &amp;lt;/props&gt;
&amp;lt;/property&gt;
&amp;lt;/bean&gt;
&amp;lt;bean id=&quot;transactionManager&quot;
class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot; &gt;
&amp;lt;property name=&quot;transactionManagerName&quot; value=&quot;java:/TransactionManager&quot; /&gt;
&amp;lt;property name=&quot;userTransactionName&quot; value=&quot;UserTransaction&quot; /&gt;
&amp;lt;/bean&gt;
&amp;lt;tx:annotation-driven transaction-manager=&quot;transactionManager&quot; /&gt;

&amp;lt;bean class=&quot;org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor&quot; /&gt;
&amp;lt;/beans&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No xml acima temos várias configurações, vamos detalhar uma por uma.&lt;/p&gt;  &lt;a name=&quot;Injeção_do_Dao_na_Aplicação&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Injeção do Dao na Aplicação&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;No XML acima temos a declaração de um Bean chamado dao. Esse bean implementa o Dao que será utilizado na nossa aplicação.&lt;/p&gt;  &lt;p&gt;Para utiliza-lo devemos fazer com que o Spring injete o mesmo na camada de Aplicação. &lt;/p&gt;  &lt;p&gt;Como essa injeção deve ser feita foge o escopo desse tutorial.&lt;/p&gt;    &lt;a name=&quot;Configuração_do_EntityManager_do_JPA&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Configuração do EntityManager do JPA&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;Vemos também no applicationContext configuração do EntityManagerFactory do JPA.&lt;/p&gt;  &lt;p&gt;No property jpaVendorAdapter definimos o uso do Hibernate como provider do JPA.&lt;/p&gt;  &lt;p&gt;Definimos também algumas propriedades do Hibernate.&lt;/p&gt;  &lt;p&gt;Para que o EntityManager seja inicializado no Dao o seguinte fragmento de código deve existir no mesmo:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;private EntityManager entityManager;
@PersistenceContext( type=PersistenceContextType.TRANSACTION, name=&quot;name&quot; )
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
&lt;/pre&gt;&lt;p&gt;Neste fragmento dizemos ao Spring que a variável entityManager vai receber uma instância criada pelo EntityManagerFactory. &lt;/p&gt;  &lt;p&gt;Assim o Spring injeta o EntityManager no Dao. &lt;/p&gt;  &lt;a name=&quot;Controle_Transacional&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Controle Transacional&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;No fim do applicationContext vemos a configuração do Controle de Transação.&lt;/p&gt;  &lt;p&gt;Definimos o JpaTransactionManager como o controlador de transações, e logo abaixo definimos que o mesmo seja feito através de annotations.&lt;/p&gt;  &lt;p&gt;Logo para definirmos quando um método deve ser executado em uma transação tudo que precisamos fazer é adicionar um annotation em cima do mesmo:&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void someMethod(){
// do some operation in a transaction
}
&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;O mesmo annotation pode ser adicionado em uma classe ou em uma interface, agindo assim sobre todos os metodos das mesmas.&lt;/p&gt;  &lt;a name=&quot;Programando_o_DAO&quot;&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Programando o DAO&lt;/span&gt;&lt;/h2&gt;  &lt;p&gt;Uma vez que possuímos o EntityManager injetado no Dao e o controle de transação já está definido a programação do Dao se torna muito simples.&lt;/p&gt;  &lt;p&gt;Vejamos um exemplo de um método que insere ou atualiza uma Entidade.&lt;/p&gt;&lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public void save(T t) throws DataBaseException {
try{
   //Consideremos que todas as entidades passadas para esse metodo possuam o metodo getId
   Object id = t.getId();
   if( id != null ){
       entityManager.merge( t );
   else{
       entityManager.persist(t);
       entityManager.flush();
} catch (Exception e) {
   throw new DataBaseException( &quot;Erro ao persistir objeto &lt;&quot; + t.getClass().getSimpleName() + &quot;&gt;&quot;, e  );
}
}
&lt;/pre&gt;&lt;/div&gt;    &lt;a name=&quot;Mapeamento_no_Hibernate_com_Annotations&quot;&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;Mapeamento no Hibernate com Annotations&lt;/span&gt;&lt;/h2&gt;  &lt;p&gt;O mapeamento das entidades pode ser feito todo via annotation reduzindo o número de XML&#39;s para a configuração da aplicação.&lt;/p&gt;  &lt;p&gt;O único XML necessário é o persistence.xml, padrão do JPA que explicita as características na Unidade de Persistencia.&lt;/p&gt;  &lt;a name=&quot;Configuração_do_persistence.xml&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Configuração do persistence.xml&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;Um exemplo de configuração do persistence.xml pode ser visto a seguir&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;persistence xmlns=&quot;http://java.sun.com/xml/ns/persistence&quot;
     xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
     xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;
     version=&quot;1.0&quot;&gt;
&amp;lt;persistence-unit name=&quot;name&quot; transaction-type=&quot;JTA&quot;&gt;
    &amp;lt;provider&gt;org.hibernate.ejb.HibernatePersistence&amp;lt;/provider&gt;
    &amp;lt;jta-data-source&gt;java:/MySqlAccounter&amp;lt;/jta-data-source&gt;
    &amp;lt;class&gt;br.com.product.project.domain.vo.Home&amp;lt;/class&gt;
    &amp;lt;class&gt;br.com.product.project.domain.vo.Room&amp;lt;/class&gt;
    &amp;lt;properties&gt;
        &amp;lt;property name=&quot;hibernate.dialect&quot; value=&quot;org.hibernate.dialect.MySQLDialect&quot; /&gt;
        &amp;lt;property name=&quot;hibernate.cache.use_second_level_cache&quot; value=&quot;false&quot; /&gt;
        &amp;lt;property name=&quot;hibernate.cache.use_query_cache&quot; value=&quot;false&quot; /&gt;
        &amp;lt;property name=&quot;hibernate.show_sql&quot; value=&quot;true&quot; /&gt;
        &amp;lt;property name=&quot;hibernate.generate_ddl&quot; value=&quot;true&quot; /&gt;
    &amp;lt;/properties&gt;
&amp;lt;/persistence-unit&gt;
&amp;lt;/persistence&gt;
&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;No arquivo configuramos a Unidade de persistencia que será usada pelo JPA.&lt;/p&gt;  &lt;p&gt;Perceba que definimos um nome para a mesma, esse nome é o mesmo que deve ser adicionado sobre o entity manager no annotation que o injeta no Dao, mostrado no item &lt;b&gt;Configuração do EntityManager do JPA&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;A primeira configuração mostra que é o provider do JPA será o hibernate.&lt;/p&gt;  &lt;p&gt;Logo em seguida é configurado o endereço do DataSource da base de dados que a Unidade de Persistência irá utilizar.&lt;/p&gt;  &lt;p&gt;Em seguida são listadas todas as classes que queremos mapear para que o JPA possa encontrálas e iniciar o mapeamento das mesmas.&lt;/p&gt;  &lt;p&gt;No exemplo o dialeto MySQLDialect é usado pois o mesmo se conectará a uma base de dados MySQL, tal variável deve ser alterada de acordo com o SGBD utilizado, também desabilitamos o segundo nível de cache e a cache de queries.&lt;/p&gt;&lt;a name=&quot;Annotations_de_Mapeamento&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Annotations de Mapeamento&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;Uma vez que definimos quais classes queremos mapear, agora precisamos inserir metadados nas mesmas para que o mapeamento seja feito corretamente.&lt;/p&gt;  &lt;p&gt;Para isso utilizamos os annotations da javax.persistence.*.&lt;/p&gt;  &lt;p&gt;Se tivermos a seguinte tabela em nossa base de dados:&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;CREATE TABLE TAB_HOME (
id INT AUTO_INCREMENT PRIMARY KEY,
address VARCHAR(50)
);
&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Vejamos um exemplo de mapeamento para a mesma&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package br.com.product.project.domain.vo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GeneratedValue;

@Entity
@Table(name = &quot;TAB_HOME&quot; )
public class DomainEnumSubscriber {

@Id @GeneratedValue
@Column( name=&quot;id&quot; )
private Integer id;

@Column( name=&quot;address&quot; )
private String address;

public Integer getId(){
    return this.id;
}

public void setId( Integer id ){
    this.id = id
}

public String getAddress(){
    return this.address;
}

public void setAddress( String address ){
    this.address = address;
}
}
&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;No código usamos o annotation &lt;b&gt;@Entity&lt;/b&gt; para mostrarmos que a classe representa uma entidade.&lt;/p&gt;  &lt;p&gt;Em seguida usamos o anntation &lt;b&gt;@Table&lt;/b&gt; para mostrar qual tabela estamos mapeando.&lt;/p&gt;  &lt;p&gt;O annotation &lt;b&gt;@Id&lt;/b&gt; mostra que o atributo se referencia a uma chave primária. e o anntation &lt;b&gt;@GeneratedValue&lt;/b&gt; que a mesma é gerada automaticamente pelo banco de dados.&lt;/p&gt;  &lt;p&gt;Em seguida o annotation &lt;b&gt;@Collumn&lt;/b&gt; serve para mapear qual a coluna que o atributo se referencia.&lt;/p&gt;  &lt;p&gt;Existem várias anotações cada uma com seus atributos, veja mais na &lt;a class=&quot;externallink&quot; rel=&quot;nofollow&quot; title=&quot;Documentação Oficial&quot; href=&quot;http://java.sun.com/products/persistence/javadoc-1_0-fr/javax/persistence/package-tree.html&quot;&gt;Documentação Oficial&lt;/a&gt;.&lt;/p&gt;  &lt;a name=&quot;Mapeamento_de_Chaves_Estrangeiras&quot;&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Mapeamento de Chaves Estrangeiras&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;Com o JPA podemos mapear as chaves estrangeiras das tabelas para que objetos já sejam inseridos dentro das entidades que as contém. Suponhamos as seguintes tabelas no banco de dados&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;CREATE TABLE TAB_HOME (
id INT AUTO_INCREMENT PRIMARY KEY,
address VARCHAR(50)
);

CREATE TABLE TAB_ROOM (
id INT AUTO_INCREMENT PRIMARY KEY,
home INT REFERENCES TAB_HOME( id ),
size INT,
);
&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Podemos mapear essa chave estrangeira de duas maneiras. Fazendo o Objeto Home ter uma lista de todos os comodos que possui (mapeamento do tipo OneToMany), ou fazendo cada comodo possuir a qual casa ele pertence (Mapeamento do tipo ManyToOne).&lt;/p&gt; &lt;a name=&quot;Mapeamento_OneToMany&quot;&gt;&lt;/a&gt;&lt;h4&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Mapeamento OneToMany&lt;/span&gt;&lt;/h4&gt;  &lt;p&gt;Para que possamos ter uma lista em uma entidade pai de todas as entidades filhas que a referenciam utilizamos o mapeamento OneToMany.&lt;/p&gt;  &lt;p&gt;Para tanto só precisamos utilizar o annotation &lt;b&gt;@OneToMany&lt;/b&gt; ao fazer o mapeamento de um atributo de uma das classes mapeadas.&lt;/p&gt;  &lt;p&gt;Vejamos um exemplo:
&lt;/p&gt;&lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;//O atributo mappedby se referencia a uma instancia de Home dentro da classe Room com o nome home
@OneToMany( targetEntity=Room.class, mappedby=&quot;home&quot; )
private Collection rooms;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com isso ao criar o objeto o mesmo busca uma lista de todos os comodos que referenciam a ele de modo lazy.&lt;/p&gt;  &lt;a name=&quot;Mapeamento_ManyToOne&quot;&gt;&lt;/a&gt;&lt;h4&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;Mapeamento ManyToOne&lt;/span&gt;&lt;/h4&gt;  &lt;p&gt;Para que possamos ter uma instância de um objeto ao qual uma chave estrangeira aponta utilizamos o mapeamento ManyToOne.&lt;/p&gt;  &lt;p&gt;Para tanto só precisamos utilizar os annotations &lt;b&gt;@ManyToOne&lt;/b&gt; e &lt;b&gt;@JoinColumn&lt;/b&gt; ao fazer o mapeamento de um atributo de uma das classes mapeadas.&lt;/p&gt;  &lt;p&gt;Vejamos um exemplo:&lt;/p&gt;  &lt;div class=&quot;scroll&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;@ManyToOne( targetEntity=Home.class )
@JoinColumn( name=&quot;home&quot; )
private Home home;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com isso ao criar o objeto o mesmo busca o objeto ao qual a chave estrangeira se relaciona e o traz de modo lazy.
&lt;/p&gt;&lt;p&gt;Mais pode ser encontrado em sites como o de referencia do &lt;a href=&quot;http://static.springframework.org/spring/docs/2.0.x/reference/&quot;&gt;Spring&lt;/a&gt; ou nesse tutorial sobre &lt;a href=&quot;http://docs.huihoo.com/java/ee/javaeetutorial5/doc/index.html&quot;&gt;J2EE&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Por favor, se você leu esse material deixa sua crítica, comentário e sujestões de melhoras&lt;/p&gt;&lt;p&gt;[]&#39;s e até a proxima
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/7594720686246691882/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/7594720686246691882' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/7594720686246691882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/7594720686246691882'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2008/06/controle-de-transao-com-spring-jta-jpa.html' title='Controle de Transação com Spring, JTA, JPA, Hibernate e Maven'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7359688639119059273.post-7780079614340476137</id><published>2008-06-21T23:23:00.000-03:00</published><updated>2008-06-21T23:52:35.156-03:00</updated><title type='text'>Olá ninguém!</title><content type='html'>Olá a ninguém que está lendo isso no momento.
Ninguém pq esse é o primeiro post do meu primeiro blog.

Minha motivação em criar esse blog foi a de inserir aqui algumas idéias sobre programação, processos de software e análises sobre linguagens e frameworks, espero que o conteúdo fique de bom nível e que com isso os leitores comecem a aparecer.

Bom, até o próximo e primeiro post com conteúdo.</content><link rel='replies' type='application/atom+xml' href='http://codeplace.blogspot.com/feeds/7780079614340476137/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7359688639119059273/7780079614340476137' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/7780079614340476137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7359688639119059273/posts/default/7780079614340476137'/><link rel='alternate' type='text/html' href='http://codeplace.blogspot.com/2008/06/ol-ningum.html' title='Olá ninguém!'/><author><name>Lucas Rosa Galego</name><uri>http://www.blogger.com/profile/00221056398279547512</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_sySFWUD7gig/SpcrNy9TEVI/AAAAAAAAADE/bQed-ugWRQ4/s1600-R/e740bfb28c64513fe831302a539b0a02.png'/></author><thr:total>0</thr:total></entry></feed>