<?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: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>2011-11-27T22:23:51.936-02:00</updated><category term='linux'/><category term='placehoder'/><category term='flash'/><category term='JPA'/><category term='design patterns'/><category term='scala'/><category term='decorator'/><category term='Hibernate'/><category term='JTA'/><category term='desenvolvimento de software'/><category term='ExpandoMetaClass'/><category term='composição'/><category term='Threads'/><category term='invokeMethod'/><category term='herança'/><category term='Java'/><category term='mplayer plugin'/><category term='chrome'/><category term='grails'/><category term='groovy'/><category term='Maven'/><category term='metaClass'/><category term='functional programming'/><category term='trait'/><category term='Transação'/><category term='jboss'/><category term='Spring'/><category term='plugins'/><category term='Transaction'/><category term='uninstall'/><category term='google'/><title type='text'>CODEPLACE</title><subtitle type='html'>Let'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?max-results=100'/><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>100</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='uninstall'/><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><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's Code Better people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-3993456083402585772?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</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.g?blogID=7359688639119059273&amp;postID=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='herança'/><category scheme='http://www.blogger.com/atom/ns#' term='composição'/><category scheme='http://www.blogger.com/atom/ns#' term='trait'/><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='scala'/><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="code" class="java"&gt;
  //classe que já possuo
  class T{
    def f = print("Ola enfermeira!")
  }
  //trait que adiciona comportamento a interface de T
  trait Profile extends T{
    abstract override def f = {
      val time = System.nanoTime()
      super.f
      println("Tempo total em nanos: " + (System.nanoTime() - time))
    }
  } 
&lt;/pre&gt;
&lt;p&gt;Ao rodar o seguinte código:&lt;/p&gt;
&lt;pre name="code" class="java"&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="code" class="java"&gt;
  trait Smile extends T{
    abstract override def f = {
      print("=)")
      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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-4826405222710381366?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='design patterns'/><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="http://www.eliezer.com.br/post/sabe-aquele-monte-de-if-e-else-no-codigo-limpando-tudo-em-java/"&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="code" class="java"&gt;
object StringUtils {                                                   
  def format( action: String =&gt; String, value: String ) = action(value)
  def removeBlanks = { (_:String).replaceAll( " ", "") }                       
  def onlyNumbers = { (_:String).replaceAll( "\\D", "" ) }             
}
&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="code" class="java"&gt;
StringUtils.format( StringUtils.removeBlanks, "Ola enfermeira" )
&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-1050844486223586806?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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="code" class="java"&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="code" class="java"&gt;
args.foreach(arg =&gt; println(arg))
&lt;/pre&gt;
&lt;p&gt;
O seguinte código define um &lt;span style="font-style:italic;"&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="code" class="java"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-5928391178682776149?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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='jboss'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento de software'/><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="code" class="xml"&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="code" class="xml"&gt;
   &lt;mbean code="org.jboss.services.binding.ServiceBindingManager"
     name="jboss.system:service=ServiceBindingManager"&gt;
     &lt;attribute name="ServerName"&gt;ports-01&lt;/attribute&gt;
     &lt;attribute name="StoreURL"&gt;${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml&lt;/attribute&gt;
     &lt;attribute name="StoreFactoryClassName"&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="code" class="xml"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-4733173816081594995?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mplayer plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><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="http://blog.chromium.org/"&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="http://dev.chromium.org/getting-involved/dev-channel"&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="http://jeanderuelle.blogspot.com/2009/07/enable-flash-on-google-chrome-linux-dev.html#comment-form"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-675146910579872811?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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='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'/><category scheme='http://www.blogger.com/atom/ns#' term='ExpandoMetaClass'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy e a magia do invokeMethod</title><content type='html'>Estava eu discutindo com meu amigo &lt;a href="http://andrerigon.wordpress.com/"&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="code" class="java"&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("Async") ){
            name = name.substring( 0, name.size()-5 );
            def m = A.metaClass.getMetaMethod(name, args)
            if( m == null ){
                println( "1. Nothing to do! No method definition found!" )
                return
            }
            def t = { 
                println( "Invoking $name in asyn way" )
                m.invoke(this,args)
            } as Runnable
            def t1 = new Thread(t)
            t1.start()
        }
        else {
           println( "2. Nothing to do! No method definition found!" )
        }
    }


}

def a = new A()

a.Async("t1")
a.c()
a.cAsync("t2")
a.b("name")
a.bAsync("t3")
a.bAsync("t4")
a.bAsync("t5")
a.bAsync("t6")
a.bAsync("t7")
a.bAsync("t8")
a.bAsync("t9")
a.bAsync("t10")
a.bAsync("t11")
a.bAsync("t12")
a.bAsync("t13")
a.bAsync("t14")
a.bAsync("t15")
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-3620737140064531673?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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='Transação'/><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='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><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="font-size:100%;"&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="Adicionando_dependências"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="xml"&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="Adicionando_repositório"&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="xml"&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="Utilização_do_Spring"&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style="font-size:100%;"&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="Configuração_do_applicationContext"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;
&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jboss="http://www.springmodules.org/schema/jboss"
xsi:schemaLocation="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"
default-autowire="byName"&gt;
&amp;lt;bean id="dao" scope="prototype"
class="br.com.product.project.commons.dao.DaoImpl"&gt;
&amp;lt;/bean&gt;
&amp;lt;bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
&amp;lt;property name="jpaProperties"&gt;
    &amp;lt;props&gt;
         &amp;lt;prop key="hibernate.transaction.factory_class"&gt;org.hibernate.transaction.JTATransactionFactory
         &amp;lt;/prop&gt;
         &amp;lt;prop key="hibernate.transaction.manager_lookup_class"&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="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager" &gt;
&amp;lt;property name="transactionManagerName" value="java:/TransactionManager" /&gt;
&amp;lt;property name="userTransactionName" value="UserTransaction" /&gt;
&amp;lt;/bean&gt;
&amp;lt;tx:annotation-driven transaction-manager="transactionManager" /&gt;

&amp;lt;bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /&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="Injeção_do_Dao_na_Aplicação"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="Configuração_do_EntityManager_do_JPA"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="code" class="java"&gt;private EntityManager entityManager;
@PersistenceContext( type=PersistenceContextType.TRANSACTION, name="name" )
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="Controle_Transacional"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="java"&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="Programando_o_DAO"&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style="font-size:100%;"&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="scroll"&gt;&lt;pre name="code" class="java"&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( "Erro ao persistir objeto &lt;" + t.getClass().getSimpleName() + "&gt;", e  );
}
}
&lt;/pre&gt;&lt;/div&gt;    &lt;a name="Mapeamento_no_Hibernate_com_Annotations"&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style="font-size:100%;"&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'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="Configuração_do_persistence.xml"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;persistence xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
     version="1.0"&gt;
&amp;lt;persistence-unit name="name" transaction-type="JTA"&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="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /&gt;
        &amp;lt;property name="hibernate.cache.use_second_level_cache" value="false" /&gt;
        &amp;lt;property name="hibernate.cache.use_query_cache" value="false" /&gt;
        &amp;lt;property name="hibernate.show_sql" value="true" /&gt;
        &amp;lt;property name="hibernate.generate_ddl" value="true" /&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="Annotations_de_Mapeamento"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="sql"&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="scroll"&gt;&lt;pre name="code" class="java"&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 = "TAB_HOME" )
public class DomainEnumSubscriber {

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

@Column( name="address" )
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="externallink" rel="nofollow" title="Documentação Oficial" href="http://java.sun.com/products/persistence/javadoc-1_0-fr/javax/persistence/package-tree.html"&gt;Documentação Oficial&lt;/a&gt;.&lt;/p&gt;  &lt;a name="Mapeamento_de_Chaves_Estrangeiras"&gt;&lt;/a&gt;&lt;h3&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="sql"&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="Mapeamento_OneToMany"&gt;&lt;/a&gt;&lt;h4&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="java"&gt;//O atributo mappedby se referencia a uma instancia de Home dentro da classe Room com o nome home
@OneToMany( targetEntity=Room.class, mappedby="home" )
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="Mapeamento_ManyToOne"&gt;&lt;/a&gt;&lt;h4&gt;&lt;span style="font-size:85%;"&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="scroll"&gt;&lt;pre name="code" class="java"&gt;@ManyToOne( targetEntity=Home.class )
@JoinColumn( name="home" )
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="http://static.springframework.org/spring/docs/2.0.x/reference/"&gt;Spring&lt;/a&gt; ou nesse tutorial sobre &lt;a href="http://docs.huihoo.com/java/ee/javaeetutorial5/doc/index.html"&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;[]'s e até a proxima
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-7594720686246691882?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&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.g?blogID=7359688639119059273&amp;postID=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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7359688639119059273-7780079614340476137?l=codeplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</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.g?blogID=7359688639119059273&amp;postID=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>
